如何正确的理解和设置队列的超时时间

队列的超时时间可以在监听时使用参数--timeout = x来设置,不设置的话默认是60秒
例如:

php artisan queue:listen --queue=default --timeout=30

##我的问题:
加入超时这只为60秒
1.这个超时时间是指:两个任务之间的空闲时间超过60就终止监听,还是指监听期间每个任务的执行时间不能超过60秒
2.如果timeout设置为0,有没有什么不良后果,work模式下即使任务很小,过很久会不会导致内存溢出
3.是否我没有正确的返回什么以告诉队列监听者我的这次任务执行完毕了

##我的猜测:
如果超时前收到过消息,则会根据最后一条消息的时间从新计算60秒后超时,这么看感觉这个超时时间就是指空闲的等待时间了,这样的话设置--timeout=0的应该是没问题的
但是,在work模式如果一条消息都没有收到过,无论过多久都不会显示超时,而收到一条消息空闲60秒后会被killed,所以感觉又是跟消费者有关系的
但是我在消费者中调用了 $this->delete();

##相关代码

消费者:

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class ProcessMessage implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    private $message;

    public function __construct($message)
    {
        $this->message = $message;
    }

    public function handle()
    {
        echo '收到消息:' . $this->message . PHP_EOL;
        $this->delete();
    }

    public function failed()
    {
        echo '失败了';
        $this->delete();
    }
}

生产者:

//可以在tinker中执行
use App\Jobs\ProcessMessage;
ProcessMessage::dispatch('这是一个' . date('H:i:s') . '发送的任务');

超时报错,上面是listen模式的,下面是work模式的

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

@youkr 可是我单个任务就只是echo了一句话,没有超过60秒,为什么还是报超时了

3年前 评论
讨论数量: 2
  1. 每个任务不能超过 60 秒
  2. 超时时间为 0 的话,不会超时。存在占用内存过多的情况,但是不用担心,可以设置队列占用的最大内存,在任务运行之后,会检查当前进程占用的内存是否超过了限定内存,如果超过的话,会杀死当前进程启动新的进程来消费任务。
  3. 没看懂

可以看源码:

  1. \Illuminate\Queue\Worker::supportsAsyncSignals
  2. \Illuminate\Queue\Worker::stopIfNecessary
3年前 评论

@youkr 可是我单个任务就只是echo了一句话,没有超过60秒,为什么还是报超时了

3年前 评论

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