为什么我的 Laravel 队列作业在 60 秒后失败?

2022-08-31 00:16:41

情况

我正在使用Laravel Queues来处理大量的媒体文件,单个作业预计需要几分钟(让我们说最多一个小时)。

我正在使用 Supervisor 运行我的队列,并且一次运行 20 个进程。我的主管配置文件如下所示:

[program:duplitron-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/duplitron/artisan queue:listen database --timeout=0 --memory=500 --tries=1
autostart=true
autorestart=true
user=duplitron
numprocs=20
redirect_stderr=true
stdout_logfile=/var/www/duplitron/storage/logs/duplitron-worker.log

有一些奇怪的事情我不知道如何解释或纠正:

  1. 我的作业在运行 60 到 65 秒后一直失败。
  2. 标记为失败后,作业即使在标记为失败后仍会继续运行。最终,它们最终会成功解决。
  3. 当我单独运行失败的任务以查找问题的原因时,它成功了。

我坚信这是一个超时问题;但是,我的印象是这将导致无限超时。--timeout=0

问题

如何防止这种临时的“失败”作业状态?是否有其他位置可能会调用我不知道的队列超时?


答案 1

事实证明,除了超时之外,还有一个设置定义在expireconfig/queue.php

    'database' => [
        'driver' => 'database',
        'table' => 'jobs',
        'queue' => 'default',
        'expire' => 60,
    ],

将其更改为更高的值可以解决问题。


更新:此参数现在称为retry_after

    'database' => [
        'driver' => 'database',
        'table' => 'jobs',
        'queue' => 'default',
        'retry_after' => 60,
    ],

答案 2

重要提示:“expire”现在称为“retry_after”(Laravel 5.4)


推荐