Laravel 排队作业的问题。开发和生产的奇怪行为不同
Posted
技术标签:
【中文标题】Laravel 排队作业的问题。开发和生产的奇怪行为不同【英文标题】:Problem with Laravel queued Jobs. Strange behavior different for dev and production 【发布时间】:2019-04-12 23:44:02 【问题描述】:当 Job 运行时,我有一个奇怪的行为: 在开发服务器(win 7 php 7.2.10)上一切正常, 在生产服务器 Linux centOS php 7.0.10 上它会抛出异常:
Illuminate\Queue\MaxAttemptsExceededException: A queued job has been attempted too many times. The job may have previously timed out.
config/queue.php
'database' => [
'driver' => 'database',
'table' => 'jobs',
'queue' => 'default',
'retry_after' => 90,
],
这发生在作业排队之后......当它开始工作......大约 30 秒后(失败) 异常在 failed_jobs 表中
虽然它可能依赖于 php max_execution_time 指令,但是当我这样做时
php -r "echo ini_get('max_execution_time') . PHP_EOL;"
它显示为零(没有超时......这是正确的)
作业以这种方式排队:
dispatch((new Syncronize($file))->onQueue('sync'));
Sincronize 作业没有超时(有 1 次尝试),只需调用两个 artisan 命令,如果从 shell 调用,这两个命令在 prod 和 dev 服务器上都可以完美运行。
https://pastebin.com/mnaHWq71
在我使用的开发服务器上启动作业
php artisan queue:work --queue=sync,newsletter,default
在产品服务器上我使用这个
https://pastebin.com/h7uv5gca
知道可能是什么原因吗?
【问题讨论】:
你使用的是什么版本的 Laravel? Laravel 5.7 需要 php >= 7.1.3。另外,您是否在命令行中指定了--timeout
选项?
5.4 ... no --timeout 指定默认为零(无超时)
作业运行多长时间?默认--timeout
设置为60 秒。另外,您的retry_after
设置是什么?
作业可以运行几分钟 .. 它同步一整套 30000 个产品 .. 没有 retry_after 设置
必须有一个retry_after
。检查您使用的连接下的config/queue.php
。如果它比作业运行所需的时间短,则可能会重试导致失败。另外,尝试向您的工作进程添加--timeout=600
或更高的数字(确保retry_after
大于超时)
【参考方案1】:
发现问题... 在我的服务/etc/init.d/myservice
cd /var/www/html/
case "$1" in
start)
php artisan queue:work --queue=sync,newsletter,default &
echo $!>/var/run/myservice.pid
echo "server daemon started"
;;
我没有检查进程是否已经在运行,所以我启动了两次。
我在ps axu
中看到了 2 个进程,似乎这就是原因
这次检查解决了
if [ -e /var/run/myservice.pid ]; then
echo "Service is running. Call stop first".
exit 1
fi
【讨论】:
以上是关于Laravel 排队作业的问题。开发和生产的奇怪行为不同的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Laravel 5.1 在 IronMQ 中获取排队作业的数量?