在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
谢谢
答案 0 :(得分:1)
使用timeout参数调用它,确定您的工作需要多长时间并从那里扩展。
nohup php artisan queue:listen --tries=3 --timeout=600
在您的配置中,您需要更新重试之后,它必须大于超时,以避免同一作业同时运行。假设您使用beanstalkd
。
'beanstalkd' => [
...
'retry_after' => 630,
...
],
在更专业的设置中,我常常会为短期工作排长队,为长期工作排长队。