Job 类中 $timeout 设置无效 ? - 已关闭

环境

linux + php7.4(pcntl enabled) + laravel7

问题背景

有如下两个队列任务:

  • JobA 是发邮件, 希望限定 timeout=60s(也就是默认 --queue=default --timeout=60)
  • JobB 是大文件上传, 耗时较长, 希望限定 timeout=3600s (1h)

期望的代码实现

// JobA
class JobA implements ShouldQueue
{
    ...
    $tries = 1;
    $timeout = 60;
    ...
    public function handle()
    {
        logger('JobA start at: ' . date('Y-m-d H:i:s'));
        sleep(70);
        logger('JobA end at: ' . date('Y-m-d H:i:s')); // exceed timeout, fail to log
    }
}
// JobB
class JobA implements ShouldQueue
{
    ...
    $tries = 1;
    $timeout = 120;
    ...
    public function handle()
    {
        logger('JobB start at: ' . date('Y-m-d H:i:s'));
        sleep(70);
        logger('JobB end at: ' . date('Y-m-d H:i:s')); // won't exceed timeout, success to log
    }
}
// terminal, 命令行不使用 --timeout 则默认 60
$ php artisan queue:work --timeout=60

// 分别调用
dispatch(new JobA); // 超时, jobA end 不能输出
dispatch(new JobB); // 结果也是超时, JobB end 也不能输出, 说明 JobB 中的 $timeout 设置无效

问题

按文档中写的 job 类中的 $timeout 应该是要优先于命令行中的 --timeout 设置, 但现在结果并不是. [已解决, 见末尾]

另附绕过 Job 类中设置 $timeout 临时解决办法

命令行中的 –timeout 是有效的, 所以使用两个进程两个队列倒是可以实现类似效果

// terminal, 命令行不使用 --timeout 则默认 60
$ php artisan queue:work --timeout=60 --queue=queueA
$ php artisan queue:work --timeout=120 --queue=queueB
// 分别调用
dispatch(new JobA)->onQueue('queueA'); // 超时, jobA end 不能输出
dispatch(new JobB)->onQueue('queueB'); // 结果未超时, JobB end 能输出, 说明命令行中 --timeout 设置可用

已解决, 原因是: 不仅要 pcntl enable, php.ini disable_functions 不能 disable 掉相关的函数.

另外, 要使用 queue:work 而不是 queue:listen 才能使 Job 类内的 $timeout 优先级高于命令行的 –timeout 参考自github issue:

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!