我有一个Laravel排队作业,它从网页中提取链接。通过Laravel Forge配置的队列侦听器的超时为240秒(4分钟)。但是,工作需要 45分钟才能运行。
我的队列设置是:
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'default',
'retry_after' => 350,
],
并且有多个作业流程正在运行 - 最多 35个流程。可以想象,这占用了大量的服务器内存。这些过程似乎徘徊不去。 top
中显示的这些流程的命令是:
php7.1 artisan queue:work redis --once --queue=linkqueue --delay=0 --memory=128 --sleep=10 --tries=1 --env=local
如果超时为240秒,作业如何运行45分钟?为什么有这么多流程 - 不应该只有一个?
此外,为什么用于提取链接的脚本应该运行45分钟的任何想法?!
脚本工作,也就是说,在大多数情况下,它按预期运行 - 只需要很长时间。据我所知,没有报告/记录错误。
工作中的代码是:
$dom = new DOMDocument;
$dom->loadHTML($html);
$links = $dom->getElementsByTagName('a');
foreach ($links as $a) {
$link = $a->getAttribute('href');
$newurl = new URL;
$newurl->url = $link;
$newurl->save();
}
更新:另一个简单的工作运行得很好,不到一秒钟。特别是上面的链接工作需要10分钟。它可能是RAM问题还是什么?还有什么我可以做的来诊断这个问题吗?作为控制台作业的一部分运行时,提取链接功能本身在1或2秒内运行。它只是排在队列中才会吓坏。
答案 0 :(得分:5)
如果超时为240秒,作业如何运行45分钟?
因为您的队列连接上有'retry_after' => 350,
。这意味着如果Laravel在350
秒后没有收到作业的声音 - 它会假定作业失败并再次重试。这导致您的情况中的一个作业的多个过程。
如果您愿意让您的工作最多运行45分钟 - 那么您应该将retry_after
设置为更大的数字。说3600
即1小时。
这样,只有花费超过1小时才能开始工作。
答案 1 :(得分:-2)
您还可以执行以下操作以使超时无限制。
php artisan queue:listen --timeout=0