123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- #!/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";
|