我有一个控制器功能,该功能可以调度job
。处理此job
后,最后将再次分派相同的job
(具有不同的参数)。共有5个相同的工作。
Queue driver: database
问题是:我记录了从create()
到handle()
的持续时间。控制器调度的第一个作业耗时1700毫秒,而作业本身调度的其他作业仅耗时40毫秒。
Queue driver: sync
当我更改为使用sync
队列驱动程序时,所有作业都以闪电般的速度工作。
发现:
第一个队列作业从create()
到handle()
花费了很长时间。在此之前,队列为空。可能是队列驱动程序问题。
为什么以及如何解决?谢谢!
更新:
添加了一个TestJob
,它在处理作业时自动调度。这意味着队列中总是有TestJob
被处理或等待处理。
重复我原来的工作,从created()
到handle()
,它们都只花了不到70毫秒。
结论:
我很确定这是队列驱动程序问题。队列为空时,工作人员似乎正在入睡。有人知道该修复程序吗?
答案 0 :(得分:1)
我在这里发布答案,希望对互联网上的其他人有用。
参考
https://divinglaravel.com/queue-system/workers
答案
将echo
和echo debug_backtrace()[1]['function'];
放在各处后,发现Illuminate\Queue\Console\WorkCommand
内的队列为空时睡眠的默认值
受保护的$ signature ='queue:work {-sleep = 3:无可用工作时的睡眠秒数}
解决方案
因此解决方案是在控制台命令中提及sleep
:
php artisan queue:work --sleep=0
感谢阅读。