如何调试队列中作业之间的退出代码 12:工作

Sum*_*ai8 4 laravel laravel-queue

我们有一个作业MyPrettyJob,它通过 redis 从控制器排队。当我们像这样从命令运行此作业时,该作业确实成功了。当我们运行包含少量数据的作业时,队列保持在线状态,但是当我们运行包含大量数据的作业时,队列崩溃,退出代码为 12,这表明出现“内存不足”错误。

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

对于大型作业,队列输出以下内容:

$ php artisan queue:work --queue=myqueue
Processing: App\Jobs\MyPrettyJob
Processed: App\Jobs\MyPrettyJob
$ echo $?
12
Run Code Online (Sandbox Code Playgroud)

无论是否有东西在该作业后面排队,队列工作人员甚至会崩溃。这似乎表明队列在清理大型作业时崩溃了,但似乎没有给出任何迹象表明那是什么。无论是否完成任何数据库交互,队列工作程序也会崩溃,这规则了与数据库相关的任何内容。

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

Gle*_*rry 6

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