Laravel 12 任务延迟依赖队列驱动的 delay()/later() 方法,需选用 Redis、Database 等支持延迟的驱动,并通过多模态队列实现按任务类型差异化调度,配合守护进程与合理配置保障准时执行。

Laravel 12 实现任务延迟,核心仍是基于队列系统的 delay() 和 later() 方法,但底层机制更灵活、调度更精准——尤其在启用多模态队列后,延迟能力可按任务类型智能分发与执行。
基础延迟:用 delay() 或 later() 设置时间
无论使用哪种队列驱动,只要支持延迟(如 redis、database、sqs),就能直接调用:
-
dispatch()->delay(now()->addMinutes(5)):延迟 5 分钟执行 -
dispatch()->delay(300):延迟 300 秒(即 5 分钟) -
dispatch()->later(now()->addHour()):指定绝对时间点执行,适合定时场景(如每天上午 9 点发通知)
这些方法会在任务序列化时写入 available_at 时间戳,队列 worker 轮询时只拉取已到期的任务。
驱动选择:确保队列连接支持延迟
同步驱动(sync)不支持延迟,必须配置为支持延迟的驱动:
- Redis:利用有序集合(ZSET)按时间排序,延迟精度高、性能好,推荐生产环境首选
-
Database:依赖
jobs表中的available_at字段轮询,适合中小型项目或调试环境 - SQS / Beanstalkd:原生支持延迟,需对应 SDK 配置
确认 .env 中设置正确:
QUEUE_CONNECTION=redis
多模态队列下的延迟增强能力
Laravel 12 的多模态队列允许你为不同任务类型设定差异化延迟策略:
- 普通异步任务(
mode('async'))走 Redis,延迟秒级可控 - 流式处理任务(
mode('stream'))可结合 Kafka 的延时投递能力,实现毫秒级窗口调度 - AI 推理任务(
mode('ai-task'))可配置超时+重试+延迟回退,避免因模型加载慢导致阻塞
例如:Bus::dispatch(newAITask($data))->onConnection('multi-modal')->mode('ai-task')->delay(now()->addSeconds(30));
关键保障:让延迟真正准时执行
延迟不准,往往不是代码问题,而是运行时保障缺失:
- 必须运行
php artisan queue:work或用 Supervisor 守护进程,否则任务永远不被消费 - 检查
retry_after配置(如 Redis 连接中),设为 60–90 秒较合理;过长会导致失败任务卡住队列 - 避免在
handle()中抛出未捕获异常,否则任务失败且可能不再重试 - 数据库驱动下,轮询间隔受
queue:work --sleep影响,高频轮询会增加 DB 压力,低频则影响延迟精度


















