|
@@ -0,0 +1,158 @@
|
|
|
+#!/usr/bin/env php
|
|
|
+<?php
|
|
|
+/**
|
|
|
+ * 测试和修复工行队列脚本
|
|
|
+ * 使用: php test_icbc_queue.php
|
|
|
+ */
|
|
|
+
|
|
|
+// 定义项目路径
|
|
|
+define('APP_PATH', __DIR__ . '/application/');
|
|
|
+define('EXTEND_PATH', __DIR__ . '/extend/');
|
|
|
+
|
|
|
+// 加载框架
|
|
|
+require __DIR__ . '/thinkphp/base.php';
|
|
|
+
|
|
|
+// 输出帮助
|
|
|
+echo "==========================================\n";
|
|
|
+echo "工行队列测试和修复工具\n";
|
|
|
+echo "==========================================\n\n";
|
|
|
+
|
|
|
+// 测试数据库连接
|
|
|
+echo "[1] 测试数据库连接...\n";
|
|
|
+try {
|
|
|
+ \think\Db::query('SELECT 1');
|
|
|
+ echo "✓ 数据库连接成功\n\n";
|
|
|
+} catch (\Exception $e) {
|
|
|
+ echo "✗ 数据库连接失败: " . $e->getMessage() . "\n\n";
|
|
|
+ exit(1);
|
|
|
+}
|
|
|
+
|
|
|
+// 检查队列表
|
|
|
+echo "[2] 检查队列表...\n";
|
|
|
+try {
|
|
|
+ $count = \think\Db::name('icbc_queue')->count();
|
|
|
+ echo "✓ 队列表存在,当前有 {$count} 条记录\n\n";
|
|
|
+} catch (\Exception $e) {
|
|
|
+ echo "✗ 队列表不存在或有错误: " . $e->getMessage() . "\n\n";
|
|
|
+ exit(1);
|
|
|
+}
|
|
|
+
|
|
|
+// 查看各状态任务数量
|
|
|
+echo "[3] 查看任务状态分布...\n";
|
|
|
+$statusMap = [
|
|
|
+ 0 => '待处理',
|
|
|
+ 1 => '处理中',
|
|
|
+ 2 => '成功',
|
|
|
+ 3 => '失败'
|
|
|
+];
|
|
|
+
|
|
|
+foreach ($statusMap as $status => $name) {
|
|
|
+ $count = \think\Db::name('icbc_queue')->where('status', $status)->count();
|
|
|
+ echo " {$name}(status={$status}): {$count} 条\n";
|
|
|
+}
|
|
|
+echo "\n";
|
|
|
+
|
|
|
+// 查看卡住的任务
|
|
|
+echo "[4] 查看卡在'处理中'超过5分钟的任务...\n";
|
|
|
+$stuckTasks = \think\Db::name('icbc_queue')
|
|
|
+ ->where('status', 1)
|
|
|
+ ->where('updatetime', '<', time() - 300)
|
|
|
+ ->select();
|
|
|
+
|
|
|
+if (count($stuckTasks) > 0) {
|
|
|
+ echo " 发现 " . count($stuckTasks) . " 个卡住的任务:\n";
|
|
|
+ foreach ($stuckTasks as $task) {
|
|
|
+ echo " ID: {$task['id']}, 手机号: {$task['mobile_phone']}, ";
|
|
|
+ echo "更新时间: " . date('Y-m-d H:i:s', $task['updatetime']) . "\n";
|
|
|
+ }
|
|
|
+
|
|
|
+ // 询问是否修复
|
|
|
+ echo "\n 是否将这些任务重置为待处理状态? (y/n): ";
|
|
|
+ $handle = fopen("php://stdin", "r");
|
|
|
+ $line = fgets($handle);
|
|
|
+ if(trim($line) == 'y' || trim($line) == 'Y') {
|
|
|
+ $affected = \think\Db::name('icbc_queue')
|
|
|
+ ->where('status', 1)
|
|
|
+ ->where('updatetime', '<', time() - 300)
|
|
|
+ ->update([
|
|
|
+ 'status' => 0,
|
|
|
+ 'error_msg' => '任务处理超时,已重置为待处理 - ' . date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
+ echo " ✓ 已重置 {$affected} 个任务\n";
|
|
|
+ }
|
|
|
+ fclose($handle);
|
|
|
+} else {
|
|
|
+ echo " ✓ 没有卡住的任务\n";
|
|
|
+}
|
|
|
+echo "\n";
|
|
|
+
|
|
|
+// 检查必要的类和函数
|
|
|
+echo "[5] 检查依赖...\n";
|
|
|
+include_once EXTEND_PATH . 'icbc/DefaultIcbcClient.php';
|
|
|
+if (class_exists('\DefaultIcbcClient')) {
|
|
|
+ echo " ✓ DefaultIcbcClient 类存在\n";
|
|
|
+} else {
|
|
|
+ echo " ✗ DefaultIcbcClient 类不存在\n";
|
|
|
+}
|
|
|
+
|
|
|
+if (function_exists('createUniqueNo')) {
|
|
|
+ echo " ✓ createUniqueNo 函数存在\n";
|
|
|
+ $testId = createUniqueNo('test', time());
|
|
|
+ echo " 测试生成: {$testId}\n";
|
|
|
+} else {
|
|
|
+ echo " ✗ createUniqueNo 函数不存在\n";
|
|
|
+}
|
|
|
+echo "\n";
|
|
|
+
|
|
|
+// 显示最近的失败任务
|
|
|
+echo "[6] 显示最近5条失败的任务...\n";
|
|
|
+$failedTasks = \think\Db::name('icbc_queue')
|
|
|
+ ->where('status', 3)
|
|
|
+ ->order('id', 'desc')
|
|
|
+ ->limit(5)
|
|
|
+ ->select();
|
|
|
+
|
|
|
+if (count($failedTasks) > 0) {
|
|
|
+ foreach ($failedTasks as $task) {
|
|
|
+ echo " ID: {$task['id']}\n";
|
|
|
+ echo " 手机号: {$task['mobile_phone']}\n";
|
|
|
+ echo " 积分: {$task['integral_value']}\n";
|
|
|
+ echo " 重试次数: {$task['retry_count']}\n";
|
|
|
+ echo " 错误信息: {$task['error_msg']}\n";
|
|
|
+ echo " ---\n";
|
|
|
+ }
|
|
|
+} else {
|
|
|
+ echo " ✓ 没有失败的任务\n";
|
|
|
+}
|
|
|
+echo "\n";
|
|
|
+
|
|
|
+// 测试调用
|
|
|
+echo "[7] 是否测试调用工行接口? (y/n): ";
|
|
|
+$handle = fopen("php://stdin", "r");
|
|
|
+$line = fgets($handle);
|
|
|
+if(trim($line) == 'y' || trim($line) == 'Y') {
|
|
|
+ echo " 执行测试调用...\n";
|
|
|
+ $testPhone = '15388010006';
|
|
|
+ $testScore = 1;
|
|
|
+
|
|
|
+ // 插入测试任务
|
|
|
+ $testId = \think\Db::name('icbc_queue')->insertGetId([
|
|
|
+ 'mobile_phone' => $testPhone,
|
|
|
+ 'integral_value' => $testScore,
|
|
|
+ 'integral_type' => '10938',
|
|
|
+ 'nickname' => '测试用户',
|
|
|
+ 'status' => 0,
|
|
|
+ 'retry_count' => 0,
|
|
|
+ 'createtime' => time(),
|
|
|
+ 'updatetime' => time(),
|
|
|
+ ]);
|
|
|
+
|
|
|
+ echo " 已创建测试任务 ID: {$testId}\n";
|
|
|
+ echo " 请运行: php think icbc_queue\n";
|
|
|
+}
|
|
|
+fclose($handle);
|
|
|
+
|
|
|
+echo "\n==========================================\n";
|
|
|
+echo "测试完成\n";
|
|
|
+echo "==========================================\n";
|
|
|
+
|