php - Laravel 队列监听器超时

标签 php laravel laravel-5.4

在我的 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。这个命令唯一做的就是分派(dispatch)一个我定义的工作:

    public function handle()
    {
        $job = (new SaveDailyPropertyPickup());
        dispatch($job);
    }

所以这个作业被分派(dispatch)了,因为我正在为我的队列使用数据库驱动程序,一个新行被插入到 jobs 表中。

到目前为止一切正常。

因为我需要一个队列监听器来处理队列,而且这个队列监听器必须永远运行,所以我这样启动队列监听器:

nohup php artisan queue:listen --tries=3 &

这会将 nohup 中的所有日志写入我的 /home 目录中名为 nohup.out 的文件

发生的事情是这样的:第一次处理队列并执行我的 SaveDailyPropertyPickup 作业的 handle 函数中定义的代码。

执行一次后,我的队列监听器就退出。当我检查日志 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,
        ...
    ],

在更专业的设置中,我通常最终会为短期运行的作业做一个队列,而为长时间运行的操作做一个队列。

关于php - Laravel 队列监听器超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55426926/

相关文章:

laravel - PresenceChannels 和 PrivateChannels 之间的区别是什么 - LARAVEL 5.8

php - 在安装了 PHP72 的 Centos7 系统上无法加载 mysqli 扩展并正常工作

php - 如何在选定的日期范围内选择运行事件?

php - 带有变量的 Laravel 重定向路由不起作用

php - laravel中每个字段的单独日期格式

php - 无法在 5.4 上安装 Laravel/Passport

laravel - 如何在 laravel eloquent 中建立模型类与另一个模型类文件夹的关系?

javascript - 如果发生分页,则 onclick 不会发生

javascript - CKEditor 忽略 Laravel 中的 BASEPATH

laravel - 如何修复在控制台上找不到的CSRF token