Laravel Queue在60秒后重新启动

时间:2017-03-03 14:55:10

标签: laravel laravel-5 queue

我有这样的工作:

//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,
        ],

1 个答案:

答案 0 :(得分:5)

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

此外,以下注释为from the documentation

  

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

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