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 排队事件侦听器与作业之间的区别

Laravel - 自动执行排队的作业[重复]

如何使用 Laravel 5.1 在 IronMQ 中获取排队作业的数量?

如果从数据库中删除,Laravel 中的排队作业是不是会停止?

Laravel 尝试排队作业,触发新尝试的正确方法?

PHP apcu 在 Laravel 排队/分派作业中不持久