在我的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
谢谢
使用超时参数调用它,计算出你的工作需要多长时间并从那里扩展。
nohup php artisan queue:listen --tries=3 --timeout=600
在您的配置中,您需要更新重试之后,它必须大于超时,以避免同时运行相同的作业。假设你使用beanstalkd
。
'beanstalkd' => [
...
'retry_after' => 630,
...
],
在更专业的设置中,我经常最终为短时间运行的作业排队,而另一个则用于长时间运行的操作。