Appearance
问题现象
系统中依赖异步队列的任务(如未支付订单超时自动取消、到期租金账单生成、微信模板消息发送、商品浏览量统计等)长时间未触发或没有执行结果。
根本原因与排查步骤
检查 Redis 连通性与队列堆积情况
- 现象:任务能成功加入队列,但没有消费者拉取执行。
- 测试:登录 Redis 命令行查看队列 Key 的长度(以默认队列为例):bash
redis-cli # 查看队列待消费任务数 LLEN queues:default - 若
LLEN数量持续增加且不减少,说明消费者监听进程未运行或已阻塞。
检查 Supervisor 队列消费者守护进程
若业务配置了独立的队列消费者,请检查 Supervisor 管理器中是否存在以下命令的守护进程:
bash
php think queue:listen --queue default- 确认该守护进程状态为 RUNNING(运行中)。
- 若状态异常,查看 Supervisor 日志定位启动报错。
前台命令行单步调试(最直接有效)
在服务器终端中手动以前台模式执行队列消费命令:
bash
cd /www/wwwroot/你的项目目录
sudo -u www php think queue:work --verbose- 触发一个业务事件(例如在手机端浏览一个商品或下一个测试订单)。
- 观察控制台输出,若代码存在 PHP 语法错误、类不存在或数据库异常,终端会直接输出完整的错误堆栈。
修复代码后必须重启守护进程
由于常驻内存机制,修改了任何队列 Job 代码(app/jobs/)或业务 Service 逻辑后,必须重启 Supervisor 中的队列与 Swoole 守护进程:
bash
supervisorctl restart all重启后即可正常按最新逻辑消费队列任务。