Laravel队列侦听器超时

问题描述 投票:4回答:1

在我的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();
    }

凌晨1点的计划任务运行我的自定义命令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

谢谢

php laravel laravel-5.4
1个回答
1
投票

使用超时参数调用它,计算出你的工作需要多长时间并从那里扩展。

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

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

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

在更专业的设置中,我经常最终为短时间运行的作业排队,而另一个则用于长时间运行的操作。

© www.soinside.com 2019 - 2024. All rights reserved.