Laravel队列在60秒后重新启动

Wis*_*tar 0 queue laravel laravel-5

我有这样的工作:

//Run very intensive script that generates files
//Notify the user that the job is done
Run Code Online (Sandbox Code Playgroud)

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

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

我使用主管:

[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
Run Code Online (Sandbox Code Playgroud)

这是我的数据库配置:

'database' => [
            'driver' => 'database',
            'table' => 'jobs',
            'queue' => 'low',
            'expire' => 600,
        ],
Run Code Online (Sandbox Code Playgroud)

如果我使用redis,行为是相同的

'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
            'queue' => 'low',
            'expire' => 600,
        ],
Run Code Online (Sandbox Code Playgroud)

pat*_*cus 7

您的配置略有关闭。我不确定expire来自哪里,但我相信您的意思是retry_after。由于您的配置未定义retry_after后键,因此Laravel将值默认为60秒。因此,您的队列在作业运行60秒后将其杀死,然后重新排队以再次尝试。

此外,以下注释来自文档

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

因此,如果您的队列工作超时将为600,建议您将retry_after设置为至少610。