Laravel接口配置队列异步处理的核心是在接口逻辑中将耗时操作推送到队列,并确保queue:work进程持续运行;关键四步为驱动配置(如.env设QUEUE_CONNECTION=redis)、创建实现ShouldQueue的任务类、用dispatch()分发任务(支持delay/onQueue)、通过Supervisor等守护worker进程。

Laravel 接口配置队列异步处理,核心不是“接口本身配队列”,而是**在接口逻辑中把耗时操作推送到队列,再确保队列工作进程持续运行**。它不依赖路由或控制器额外配置,关键在驱动选择、任务封装、分发方式和进程守护四步闭环。
选对队列驱动并启用
先确认 `.env` 中的驱动与实际运行环境匹配:
- 开发阶段可用
QUEUE_CONNECTION=database,执行php artisan queue:table && php artisan migrate创建 jobs 表 - 生产环境强烈推荐
QUEUE_CONNECTION=redis,需安装predis/predis扩展并确保 Redis 服务正常运行 - 切忌混用:比如 `.env` 设为 redis,却运行
php artisan queue:work database—— 任务会进 Redis,但 worker 只监听数据库,永远不消费
创建可排队的任务类
用 Artisan 命令生成标准任务类,它自动实现 ShouldQueue 接口:
php artisan make:job SendNotification- 构造函数只保存必要参数(如用户 ID、订单号),避免传模型实例(序列化风险)
- 所有实际逻辑写在
handle()方法里,例如调用邮件服务、上传文件、请求第三方 API - 显式设置重试策略:
public $tries = 3;和public $backoff = 5;,防止失败后直接进 failed_jobs
在接口逻辑中分发任务
控制器或 API 方法里,不再同步执行耗时代码,改用 dispatch() 推入队列:
- 基础用法:
SendNotification::dispatch($userId); - 延迟执行:
SendNotification::dispatch($userId)->delay(now()->addSeconds(30)); - 指定队列名(便于分流管理):
SendNotification::dispatch($userId)->onQueue('notifications'); - 若需覆盖默认连接(如临时走 SQS):
->onConnection('sqs')
让 worker 持续监听并处理
队列不会自动运行,必须手动启动并长期守护:
- 本地调试可临时运行:
php artisan queue:work --verbose,看实时日志确认是否“Processing” - 生产环境必须用 Supervisor、Systemd 或 pm2 等进程管理器常驻运行
- Supervisor 示例配置中,
command必须明确指定连接,如php /var/www/artisan queue:work redis --sleep=3 --tries=3 - 代码更新后,务必重启 worker 进程,否则仍运行旧逻辑
不复杂但容易忽略:接口返回快了,是因为任务已“推走”;真正执行靠的是那个一直在后台跑的 queue:work 进程。漏掉驱动配置、任务类声明、分发调用或 worker 守护中的任一环,队列就只是个安静的数据表或 Redis key。


















