【问题标题】:Laravel Queue Restarts After 60 secondsLaravel 队列在 60 秒后重启
【发布时间】:2017-07-23 17:59:00
【问题描述】:

我有这样的工作:

//Run very intensive script that generates files
//Notify the user that the job is done

我知道脚本需要 4-5 分钟才能运行,因为这是生成所有文件所需的时间。 但是,正好在 60 秒后,该作业被删除(即,我在我的 jobs 数据库表中没有看到它)并且用户会收到通知。然后,每隔 60 秒,在脚本完成之前,用户会收到通知作业已完成。

作业不会失败。该作业仅在前 60 秒内出现在 jobs 表中。文件生成脚本只运行一次。

我使用主管:

[program:queue]
process_name=%(program_name)s_%(process_num)02d
command=php artisan queue:work --timeout=600 --queue=high,low
user=forge
numprocs=8
directory=/home/forge/default
stdout_logfile=/home/forge/default/storage/logs/supervisor.log
redirect_stderr=true

这是我的数据库配置:

'database' => [
            'driver' => 'database',
            'table' => 'jobs',
            'queue' => 'low',
            'expire' => 600,
        ],

如果我使用redis,行为是一样的

'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
            'queue' => 'low',
            'expire' => 600,
        ],

【问题讨论】:

    标签: laravel laravel-5 queue


    【解决方案1】:

    您的配置稍有偏差。我不确定expire 来自哪里,但我相信您的意思是retry_after。由于您的配置没有在键后定义 retry_after,因此 Laravel 默认值为 60 秒。因此,您的队列会在运行 60 秒后终止作业并重新排队以重试。

    另外,下面的注释是from the documentation

    --timeout 值应始终比retry_after 配置值至少短几秒钟。这将确保处理给定作业的工作人员总是在重试作业之前被杀死。如果您的 --timeout 选项比您的 retry_after 配置值长,您的作业可能会被处理两次。

    所以,如果您的队列工作超时将是 600,我建议您将 retry_after 设置为至少 610。

    【讨论】:

    • “因此,您的队列在运行 60 秒后将终止作业并重新排队以重试。”根据您粘贴的文档,这似乎不正确。那里说它不会被杀死,但如果它低于他的情况,它会被处理两次。
    猜你喜欢
    • 2016-04-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多