首页 文章

Laravel排队的工作运行时间超过超时

提问于
浏览
3

我有一个Laravel排队的工作,它从网页中提取链接 . 通过Laravel Forge配置的队列侦听器的超时为240秒(4分钟) . 但是,工作需要达到 45 minutes 才能运行 .

我的队列设置是:

'redis' => [
    'driver' => 'redis',
    'connection' => 'default',
    'queue' => 'default',
    'retry_after' => 350,
],

并且有多个作业流程正在运行 - 最多 35 processes . 可以想象,这占用了大量的服务器内存 . 这些过程似乎徘徊不去 . 这些进程的命令如 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();
}

Update :另一个简单的工作运行得很好,不到一秒钟 . 特别是上面的链接工作需要10分钟 . 它可能是RAM问题还是什么?还有什么我可以做的来诊断这个问题吗?作为控制台作业的一部分运行时,提取链接功能本身在1或2秒内运行 . 它只是排在队列中才会出类拔萃 .

2 回答

  • 4

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

    因为队列连接上有 'retry_after' => 350, . 这意味着如果Laravel在 350 秒后没有收到作业的声音 - 它会假定作业失败并再次重试 . 这导致您的情况中的一个作业的多个过程 .

    如果您乐意让您的作业运行长达45分钟 - 那么您应该将 retry_after 设置为更大的数字 . 说 3600 这是1小时 .

    这样,只有运行时间超过1小时才能启动作业 .

  • -2

    您还可以执行以下操作以使超时无限制 .

    php artisan queue:listen --timeout=0
    

相关问题