test_icbc_queue.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #!/usr/bin/env php
  2. <?php
  3. /**
  4. * 测试和修复工行队列脚本
  5. * 使用: php test_icbc_queue.php
  6. */
  7. // 定义项目路径
  8. define('APP_PATH', __DIR__ . '/application/');
  9. define('EXTEND_PATH', __DIR__ . '/extend/');
  10. // 加载框架
  11. require __DIR__ . '/thinkphp/base.php';
  12. // 输出帮助
  13. echo "==========================================\n";
  14. echo "工行队列测试和修复工具\n";
  15. echo "==========================================\n\n";
  16. // 测试数据库连接
  17. echo "[1] 测试数据库连接...\n";
  18. try {
  19. \think\Db::query('SELECT 1');
  20. echo "✓ 数据库连接成功\n\n";
  21. } catch (\Exception $e) {
  22. echo "✗ 数据库连接失败: " . $e->getMessage() . "\n\n";
  23. exit(1);
  24. }
  25. // 检查队列表
  26. echo "[2] 检查队列表...\n";
  27. try {
  28. $count = \think\Db::name('icbc_queue')->count();
  29. echo "✓ 队列表存在,当前有 {$count} 条记录\n\n";
  30. } catch (\Exception $e) {
  31. echo "✗ 队列表不存在或有错误: " . $e->getMessage() . "\n\n";
  32. exit(1);
  33. }
  34. // 查看各状态任务数量
  35. echo "[3] 查看任务状态分布...\n";
  36. $statusMap = [
  37. 0 => '待处理',
  38. 1 => '处理中',
  39. 2 => '成功',
  40. 3 => '失败'
  41. ];
  42. foreach ($statusMap as $status => $name) {
  43. $count = \think\Db::name('icbc_queue')->where('status', $status)->count();
  44. echo " {$name}(status={$status}): {$count} 条\n";
  45. }
  46. echo "\n";
  47. // 查看卡住的任务
  48. echo "[4] 查看卡在'处理中'超过5分钟的任务...\n";
  49. $stuckTasks = \think\Db::name('icbc_queue')
  50. ->where('status', 1)
  51. ->where('updatetime', '<', time() - 300)
  52. ->select();
  53. if (count($stuckTasks) > 0) {
  54. echo " 发现 " . count($stuckTasks) . " 个卡住的任务:\n";
  55. foreach ($stuckTasks as $task) {
  56. echo " ID: {$task['id']}, 手机号: {$task['mobile_phone']}, ";
  57. echo "更新时间: " . date('Y-m-d H:i:s', $task['updatetime']) . "\n";
  58. }
  59. // 询问是否修复
  60. echo "\n 是否将这些任务重置为待处理状态? (y/n): ";
  61. $handle = fopen("php://stdin", "r");
  62. $line = fgets($handle);
  63. if(trim($line) == 'y' || trim($line) == 'Y') {
  64. $affected = \think\Db::name('icbc_queue')
  65. ->where('status', 1)
  66. ->where('updatetime', '<', time() - 300)
  67. ->update([
  68. 'status' => 0,
  69. 'error_msg' => '任务处理超时,已重置为待处理 - ' . date('Y-m-d H:i:s')
  70. ]);
  71. echo " ✓ 已重置 {$affected} 个任务\n";
  72. }
  73. fclose($handle);
  74. } else {
  75. echo " ✓ 没有卡住的任务\n";
  76. }
  77. echo "\n";
  78. // 检查必要的类和函数
  79. echo "[5] 检查依赖...\n";
  80. include_once EXTEND_PATH . 'icbc/DefaultIcbcClient.php';
  81. if (class_exists('\DefaultIcbcClient')) {
  82. echo " ✓ DefaultIcbcClient 类存在\n";
  83. } else {
  84. echo " ✗ DefaultIcbcClient 类不存在\n";
  85. }
  86. if (function_exists('createUniqueNo')) {
  87. echo " ✓ createUniqueNo 函数存在\n";
  88. $testId = createUniqueNo('test', time());
  89. echo " 测试生成: {$testId}\n";
  90. } else {
  91. echo " ✗ createUniqueNo 函数不存在\n";
  92. }
  93. echo "\n";
  94. // 显示最近的失败任务
  95. echo "[6] 显示最近5条失败的任务...\n";
  96. $failedTasks = \think\Db::name('icbc_queue')
  97. ->where('status', 3)
  98. ->order('id', 'desc')
  99. ->limit(5)
  100. ->select();
  101. if (count($failedTasks) > 0) {
  102. foreach ($failedTasks as $task) {
  103. echo " ID: {$task['id']}\n";
  104. echo " 手机号: {$task['mobile_phone']}\n";
  105. echo " 积分: {$task['integral_value']}\n";
  106. echo " 重试次数: {$task['retry_count']}\n";
  107. echo " 错误信息: {$task['error_msg']}\n";
  108. echo " ---\n";
  109. }
  110. } else {
  111. echo " ✓ 没有失败的任务\n";
  112. }
  113. echo "\n";
  114. // 测试调用
  115. echo "[7] 是否测试调用工行接口? (y/n): ";
  116. $handle = fopen("php://stdin", "r");
  117. $line = fgets($handle);
  118. if(trim($line) == 'y' || trim($line) == 'Y') {
  119. echo " 执行测试调用...\n";
  120. $testPhone = '15388010006';
  121. $testScore = 1;
  122. // 插入测试任务
  123. $testId = \think\Db::name('icbc_queue')->insertGetId([
  124. 'mobile_phone' => $testPhone,
  125. 'integral_value' => $testScore,
  126. 'integral_type' => '10938',
  127. 'nickname' => '测试用户',
  128. 'status' => 0,
  129. 'retry_count' => 0,
  130. 'createtime' => time(),
  131. 'updatetime' => time(),
  132. ]);
  133. echo " 已创建测试任务 ID: {$testId}\n";
  134. echo " 请运行: php think icbc_queue\n";
  135. }
  136. fclose($handle);
  137. echo "\n==========================================\n";
  138. echo "测试完成\n";
  139. echo "==========================================\n";