我有一个从网页中提取链接的 Laravel 排队作业。通过 Laravel Forge 配置的 Queue 监听器的超时时间是 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 秒内运行。它只是在队列中吓坏了。