3

我有一个从网页中提取链接的 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 秒内运行。它只是在队列中吓坏了。

4

2 回答 2

5

如果超时为 240 秒,一个作业如何运行 45 分钟?

因为你有'retry_after' => 350,你的队列连接。这意味着如果 Laravel 在几秒钟后没有收到作业的消息350- 它假定作业失败并再次重试。这导致在您的情况下一项工作的多个进程。

如果您愿意让您的作业运行长达 45 分钟 - 那么您应该设置retry_after一个更大的数字。说3600哪个是 1 小时。

这样,只有在运行时间超过 1 小时时才会开始作业。

于 2017-05-06T22:59:59.970 回答
-2

您还可以执行以下操作以使超时不受限制。

php artisan queue:listen --timeout=0
于 2017-06-08T14:47:32.673 回答