如何在 queue:work 中的作业之间调试退出代码 12

How do I debug an exit code 12 between jobs in queue:work

我们有一个作业MyPrettyJob,它从控制器通过 redis 排队。当我们从这样的命令 运行 这个作业时,作业确实成功了。当我们 运行 数据很少的作业时,队列保持在线,但是当我们 运行 数据很多的作业时,队列崩溃,退出代码为 12,这表明 "Out of Memory"错误。

大型作业处理大约 300.000 个项目,它们大多相互依赖。为此,我们不能在不造成严重性能影响的情况下真正拆分这项工作。在某些极端情况下,它可能需要长达数小时,而不是目前需要的几分钟。

对于大型作业,队列输出如下:

$ php artisan queue:work --queue=myqueue
Processing: App\Jobs\MyPrettyJob
Processed: App\Jobs\MyPrettyJob
$ echo $?
12

队列工作器甚至会崩溃,无论是否有东西在该作业后面排队。这似乎表明队列因大型作业的清理而崩溃,但它似乎没有给出任何迹象表明那是什么。无论是否完成任何数据库交互,队列工作程序也会崩溃,这决定了与数据库相关的任何事情。

队列在中间作业中做什么?我可以以任何方式调试它在完成作业后内存不足的原因吗?队列可能会向日志中写入一些内容,还是在作业之间在 Redis 中执行某些操作?该进程崩溃的时间似乎真的很奇怪。

当队列工作系统确定它使用的内存超过允许的内存时,会出现退出代码 12(请参阅 https://github.com/laravel/framework/blob/5.8/src/Illuminate/Queue/Worker.php#L199-L210 了解特定代码部分)。如果你 运行 php artisan queue:work --memory=<digit> 内存足以完全 运行 你的工作(例如,1024 代表 1GB),你应该能够让你的工作完成并继续 运行事后。