Laravel排队等待"被杀#34;

时间:2017-08-07 03:32:07

标签: laravel laravel-5 queue

有时,当我将大型数据集发送到作业时,我的队列工作人员会突然退出。

// $taskmetas is an array with other arrays, each subsequent array having 90 properties.
$this->dispatch(new ProcessExcelData($excel_data, $taskmetas, $iteration, $storage_path));

ProcessExcelData作业类使用box/spout包创建excel文件。

    第一个例子中的
  • $taskmetas有880行 - 工作正常
  • 第二个示例中的
  • $taskmetas有10,000行 - 突然退出

第一个示例 - 使用小数据集的队列输出:

forge@user:~/myapp.com$ php artisan queue:work --tries=1
[2017-08-07 02:44:48] Processing: App\Jobs\ProcessExcelData
[2017-08-07 02:44:48] Processed:  App\Jobs\ProcessExcelData

第二个示例 - 具有大型数据集的队列输出:

forge@user:~/myapp.com$ php artisan queue:work --tries=1
[2017-08-07 03:18:47] Processing: App\Jobs\ProcessExcelData
Killed

我没有收到任何错误消息,日志都是空的,并且作业没有像其他错误一样出现在failed_jobs表中。时间限制设置为1小时,内存限制为2GB。

为什么我的队列突然退出?

5 个答案:

答案 0 :(得分:5)

您可以尝试暂停。 例如。 php artisan队列:work --timeout = 120

默认情况下,超时为60秒,因此我们强制覆盖超时,如上所述

答案 1 :(得分:1)

有时候,您需要处理大量资源,例如图像转换或BIG excel文件创建/解析。超时选项还不够。您可以在工作中设置public $timeout = 0;,但由于内存原因(!)仍然无效。默认情况下,内存限制为128 MB。要解决此问题,只需添加--memory=256(或heigher)选项即可避免此问题。

顺便说一句:

时间限制设置为1小时,内存限制设置为2GB

在您的情况下,此方法仅适用于php-fpm,而不适用于队列进程工作器。

答案 2 :(得分:0)

这对我有用:

我有一个Supervisord工作:

Job ID, Queue, Processes, Timeout, Sleep Time, Tries, Action Job_1,
Default, 1, 60, 3, 3

https://laravel.com/docs/5.6/queues#retrying-failed-jobs说:

  

要删除所有失败的作业,您可以使用queue:flush   命令:

     

php artisan queue:flush

所以我这样做了(在运行php artisan queue:failed之后看到有失败的工作)。

然后我删除了我的Supervisord作业并创建了一个像它一样的新作品但是有360秒的超时。

同样重要的是要记住重新启动Supervisord作业(在我的Cloudways应用程序的控制面板中)并重新启动整个Supervisord进程(在我的Cloudways服务器的控制面板中)。

在尝试再次运行我的作业后,我在failed_jobs表中注意到它并且读取该异常与缓存文件权限有关,因此我在我的Cloudways仪表板中单击了我的应用程序的“重置权限”按钮。 / p>

答案 3 :(得分:0)

有2个选项。内存不足或超过执行时间。

尝试$ dmesg | grep php,这将向您显示更多详细信息

在php.ini文件中增加max_execution_time和/或memory_limit

答案 4 :(得分:0)

我知道这不是您想要的。但是我有同样的问题,我认为这是操作系统的公元前版本(如果我找到确切的原因,我会更改它),但让我们检查一下

function translate(stringToTranslate){
  //Detect Language
  //Translate to English
  return translatedString
}

代替

queue:listen

这两者之间的主要区别是queue:listen运行每个作业的Job类代码(因此您无需重新启动工作人员或主管),但是queue:work使用缓存系统并且工作速度比queue:listen和操作系统无法处理此速度并准备队列连接(在我的情况下为Redis)

  

queue:listen命令将在自身中运行queue:work(您可以从运行中进行检查   在 htop 或..)

中处理

但是告诉您检查queue:listen命令的 speed 的原因。操作系统可以以这种速度轻松工作,并且没有问题来处理您的队列连接和...(在我的情况下,不再存在任何静默终止)

要了解您是否遇到问题,可以将队列驱动程序从.env更改为“同步” ,并查看它是否再次被杀死-如果未被杀死,您可以知道问题在于准备使用的队列连接

  • 要知道是否有内存问题,请使用listen方法或sync运行队列,并且php会为此返回一个错误,然后可以增加内存以再次进行测试

  • 您可以使用此代码为代码中的测试提供更多内存

    queue:work