Laravel 5.5:Supervisor无法执行队列中全部任务
嘿,我来帮你分析下这个奇怪的问题!你提到程序分发的QuoteCommitSavedListener任务执行完成后,本该触发的两个QuoteCommitNotification任务(都实现了ShouldQueue接口)却没在日志里出现,命令执行日志只显示到一半就截断了,这确实有点让人摸不着头脑。
先把你的场景和执行信息整理清楚:
- 触发流程:
QuoteCommitSavedListener→ 两个QuoteCommitNotification队列任务 - 执行的队列命令:
php /home/nginx/test/artisan queue:work redis --queue=default --tries=3
- 现有日志输出:
[2018-04-04 07:25:17] Processing: App\Listeners\QuoteCommitSavedListener
[2018-04-04 07:25:18] Processed: App\Listeners\QuoteCommitSavedListener
[2018-04-04 07:...
下面是几个针对性的排查方向和解决方案,你可以一步步试:
1. 先确认Listener里的任务分发逻辑没问题
打开QuoteCommitSavedListener的handle方法,检查是否确实正确触发了两个QuoteCommitNotification任务。比如有没有调用Notification::send()(如果是通知类的话)或者dispatch()方法,有没有被某个条件判断给跳过了——比如有没有漏写代码,或者某个分支逻辑导致任务没被推送。
2. 检查Notification任务的队列配置
确保QuoteCommitNotification类里的$connection和$queue属性是正确的:
- 如果任务指定了非
default的队列名称,那你当前的queue:work命令只监听default队列,自然不会处理这些任务; - 如果
$connection不是redis,那任务会被推送到其他连接的队列里,当前worker也拿不到。
3. 直接查看Redis队列里的任务
用Redis客户端执行命令:
LRANGE queues:default 0 -1
看看default队列里有没有这两个Notification任务:
- 如果没有,说明Listener根本没把任务推送到队列,回到第一步检查代码;
- 如果有,那说明任务已经在队列里,但worker没处理,或者处理时出错了。
4. 开启 verbose 日志看详情
执行队列命令时加上--verbose参数,能输出更详细的执行日志,包括任务执行时的异常信息:
php /home/nginx/test/artisan queue:work redis --queue=default --tries=3 --verbose
这样如果任务执行时抛出了异常,你就能看到具体错误,比如数据库连接问题、参数错误之类的。
5. 确认ShouldQueue接口的实现是否正确
检查QuoteCommitNotification类:
- 有没有正确
implements ShouldQueue; - 有没有重写
shouldQueue()方法并返回false?如果有的话,任务会同步执行,不会进入队列,自然不会被队列worker处理。
6. 检查失败队列
如果任务执行失败被放入了失败队列,可以用这个命令查看失败任务的详情:
php artisan queue:failed
这里会显示失败任务的具体信息和失败原因,能帮你快速定位问题。
内容的提问来源于stack exchange,提问作者Daniel Sun

