Laravel队列侦听器超时

时间:2019-03-30 00:10:51

标签: php laravel laravel-5.4

在Linux服务器上,我具有以下cron:

* * * * * php /var/www/core/v1/general-api/artisan schedule:run >> /dev/null 2>&1

CRON正常工作。我在Kernel.php中定义了一个调度命令,如下所示:

    protected function schedule(Schedule $schedule)
    {
        $schedule->command('pickup:save')
            ->dailyAt('01:00');
        $schedule->command('queue:restart')->hourly();
    }

计划在1AM运行的任务运行我的自定义命令php artisan pickup:save。该命令唯一要做的就是分派我定义的Job:

    public function handle()
    {
        $job = (new SaveDailyPropertyPickup());
        dispatch($job);
    }

因此该工作已分派,并且由于我将数据库驱动程序用于队列,因此将新行插入到jobs表中。

到目前为止,一切都很好。

由于我需要一个队列侦听器来处理队列,并且由于该队列侦听器必须永久运行,所以我像这样启动队列侦听器:

nohup php artisan queue:listen --tries=3 &

这会将nohup中的所有日志写入我nohup.out目录中名为/home的文件

这是怎么回事:第一次处理队列,并执行了我的handle作业的SaveDailyPropertyPickup函数中定义的代码。

执行一次后,我的队列侦听器退出。当我检查日志nohup.out时,我看到以下错误:

In Process.php line 1335:

  The process "'/usr/bin/php7.1' 'artisan' queue:work '' --once --queue='default' 
  --delay=0 --memory=128 --sleep=3 --tries=3" exceeded the timeout of 60 seconds.

我检查了this answer,它说在我启动队列侦听器时将超时指定为0,但是也有不建议使用此方法的答案。我还没有尝试过,所以我不知道它是否可以在我的情况下起作用。

对我目前的状况有何建议?

Laravel版本是5.4

谢谢

1 个答案:

答案 0 :(得分:1)

使用timeout参数调用它,确定您的工作需要多长时间并从那里扩展。

nohup php artisan queue:listen --tries=3 --timeout=600

在您的配置中,您需要更新重试之后,它必须大于超时,以避免同一作业同时运行。假设您使用beanstalkd

    'beanstalkd' => [
        ...
        'retry_after' => 630,
        ...
    ],

在更专业的设置中,我常常会为短期工作排长队,为长期工作排长队。