如何在队列:工作

时间:2019-04-12 14:17:39

标签: laravel laravel-queue

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

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

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

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

无论该作业后面有什么队列,队列工作器甚至崩溃。这似乎表明队列是由于清理大型作业而崩溃的,但似乎并没有给出任何指示。不管是否完成任何数据库交互,队列工作器也都会崩溃,从而统治与数据库相关的所有事情。

队列在中间做些什么?我可以以任何方式调试为什么作业完成后内存不足吗?队列可能在日志中写了什么,还是在作业之间进行了Redis操作?该进程崩溃似乎真是一个不可思议的时刻。

1 个答案:

答案 0 :(得分:1)

退出代码12是在队列工作器系统确定其使用的内存超出允许的范围时发生的(有关代码的特定部分,请参见https://github.com/laravel/framework/blob/5.8/src/Illuminate/Queue/Worker.php#L199-L210)。如果在php artisan queue:work --memory=<digit>运行的内存足以完全运行作业的情况下(例如1GB为1024),则应该能够允许您的作业完成并在事实发生后继续运行。