有时,当我将大型数据集发送到作业时,我的队列工作人员会突然退出。
// $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。
为什么我的队列突然退出?
答案 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