php - Laravel 队列作业运行时间超过超时时间

标签 php laravel laravel-5.3 laravel-queue

我有一个 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 分钟。可能是内存问题还是什么?我还能做些什么来诊断问题吗?当作为控制台作业的一部分运行时,提取链接功能本身会在 1 或 2 秒内运行。只有在队列上才会吓坏。

最佳答案

How can a job run for 45 minutes if the timeout is 240 seconds?

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

如果您愿意让您的作业最多运行 45 分钟 - 那么您应该将 retry_after 设置为更大的数字。假设 3600 即 1 小时。

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

关于php - Laravel 队列作业运行时间超过超时时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41998990/

相关文章:

php - 替换文件中的一行而不重写整个文件(在 PHP 中)

javascript - jQuery Ajax JSON PHP 自动提示重复数据显示

php - 在 Laravel Eloquent 集合的每个元素的开头添加一个项目

php - Laravel 在 hasManyThrough 中包含用户的帖子

php - 如何在 Laravel 中保存多选数据

php - 无法从mysql数据库加载数据

php - 丢失的 ;声明之前

mysql - 从数据表中获取值

php - 从 View 中的公用文件夹调用 CSS。拉维尔 5.3

laravel-5 - api 或 web Laravel 5.3