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 协议》,转载必须注明作者和本文链接