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

Laravel 如何在queue:work中的作业之间调试退出代码12,laravel,laravel-queue,Laravel,Laravel Queue,我们有一个jobMyPrettyJob,它从控制器通过redis排队。当我们像这样从命令运行此作业时,该作业确实成功。当我们使用少量数据运行作业时,队列保持在线,但当我们使用大量数据运行作业时,队列崩溃,退出代码为12,这表明存在“内存不足”错误 大型作业处理约30万个项目,这些项目大多相互依赖。为此,我们不能在不造成严重性能影响的情况下真正拆分此工作。在某些极端情况下,这可能需要数小时,而不是目前需要的几分钟 对于大型作业,队列输出以下内容: $ php artisan queue:work

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

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

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

$ php artisan queue:work --queue=myqueue
Processing: App\Jobs\MyPrettyJob
Processed: App\Jobs\MyPrettyJob
$ echo $?
12
队列工作者甚至会崩溃,不管作业后面是否有队列。这似乎表明队列在清理大型作业时崩溃,但似乎没有给出任何指示。无论是否进行了任何数据库交互,队列工作程序也会崩溃,这将规则与数据库相关的任何内容


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

当队列工作程序系统确定其使用的内存超过允许的内存时,会出现退出代码12(请参阅代码的特定部分)。如果您运行
php artisan queue:work--memory=
,其中内存足以完全运行您的作业(例如,1GB为1024),您应该能够允许您的作业完成并在事后继续运行。

将数据按块推到队列中,以避免内存不足。如果没有大量内存(以小时为单位),我们不可能真正做到这一点开销损失。@Sumurai8作业执行的是什么操作?它正在处理大约300.000个在遍历数据集后需要放入数据库的项。由于大多数项依赖于其他项,因此最有效的方法是将所有数据都存储在内存中。由于300000次更新需要很长时间,我们将任何数据库交互推迟到本作业的最后。无论我们是否进行数据库交互,队列都会崩溃,但无论哪种情况,作业都会成功。我相信这意味着它到达了作业的handle方法的末尾。队列也会崩溃,不管后面是否还有其他队列。我相信这意味着这是在清理工作期间。