sam*_*les 3 php laravel laravel-queue laravel-5.3
我有一个Laravel排队的工作,它从网页中提取链接。通过Laravel Forge配置的队列侦听器的超时为240秒(4分钟)。但是,作业最多需要45分钟才能运行。
我的队列设置是:
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'default',
'retry_after' => 350,
],
Run Code Online (Sandbox Code Playgroud)
并且有多个作业流程正在运行-多达35个流程。可以想象,这正在消耗大量服务器内存。这些过程似乎一直徘徊。这些过程的命令如下所示top:
php7.1 artisan queue:work redis --once --queue=linkqueue --delay=0 --memory=128 --sleep=10 --tries=1 --env=local
Run Code Online (Sandbox Code Playgroud)
如果超时为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();
}
Run Code Online (Sandbox Code Playgroud)
更新:另一个简单的工作就可以在不到一秒钟的时间内运行良好。特别是上面的链接作业需要10分钟的时间。可能是RAM问题吗?我还能做些什么来诊断问题?作为控制台作业的一部分运行时,提取链接功能本身将在1或2秒内运行。它只是在队列中吓坏了。
如果超时为240秒,作业如何运行45分钟?
因为您有'retry_after' => 350,队列连接。这意味着如果Laravel在350几秒钟后没有收到作业的消息-则认为作业已失败并再次重试。这导致您遇到的情况是一项工作的多个过程。
如果您愿意允许您的作业最多运行45分钟-那么您应该设置retry_after为更大的数量。说3600是1个小时。
这样,只有在运行时间超过1小时后,作业才能开始。