You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Laravel队列动态设置用户自定义超时时间?

Laravel队列自定义用户超时时间的解决方案

方案1:利用Laravel队列原生超时配置(推荐)

Laravel的Queueable trait自带timeout()方法,可直接为单个任务绑定用户自定义的超时时间,无需在handle()里手动判断超时逻辑。队列worker会自动监控任务执行时长,超时后直接终止进程并标记任务失败。

修改后的队列类代码:

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

    public function __construct(int $userTimeout)
    {
        // 绑定用户设置的超时时间(单位:秒)
        $this->timeout($userTimeout);
    }

    public function handle()
    {
        MyService::compute(); 
        // 超出设置的timeout后,worker会自动终止任务并标记失败,无需额外代码
    }
}

方案2:任务执行中主动检查超时(适用于需自定义失败逻辑的场景)

如果耗时任务支持拆分为多个可中断的子步骤,且需要在超时后执行自定义清理逻辑,可以在任务启动时记录时间戳,定期检查是否超时:

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

    private $userTimeout;
    private $startTime;

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

    public function handle()
    {
        $this->startTime = time();
        
        // 假设耗时任务可拆分为多个子步骤
        foreach (MyService::getComputeSteps() as $step) {
            // 每步执行前检查超时
            if ($this->isTimedOut()) {
                $this->fail(new \Exception("任务超出用户设置的超时时间:{$this->userTimeout}秒"));
                // 执行自定义清理逻辑(如释放资源、通知用户等)
                return;
            }
            MyService::executeStep($step);
        }
    }

    private function isTimedOut(): bool
    {
        return (time() - $this->startTime) >= $this->userTimeout;
    }
}

注意事项

  • 原生超时方案的时间单位为秒,若用户传入的是分钟/毫秒等单位,需提前转换;
  • Redis队列驱动默认支持worker终止超时任务,其他驱动需确认是否兼容;
  • 避免在handle()中使用阻塞式的超时检查(如循环sleep),会浪费进程资源,优先使用原生超时机制。

内容的提问来源于stack exchange,提问作者mending3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:20:28