Laravel队列核心是异步执行耗时操作,配置需选对驱动(如Redis)、定义任务类、正确分发(dispatch)、守护进程运行(如Supervisor),四步确保稳定高效。

在 Laravel 中使用队列,核心是把耗时操作(如发邮件、生成报表、调用第三方 API)从 Web 请求中剥离,交给后台进程异步执行,避免用户等待。关键不是“能不能用”,而是“怎么配得稳、跑得准、看得清”。
配置队列驱动和连接
Laravel 支持多种队列后端:database(适合开发)、redis(推荐生产)、sync(同步,仅用于调试)、beanstalkd 等。先在 .env 中指定默认驱动:
QUEUE_CONNECTION=redis然后确保 config/queue.php 中对应连接已正确定义。例如 Redis 连接需确认 REDIS_HOST 和 REDIS_PASSWORD 正确;若用 database 驱动,需先运行:
php artisan queue:tablephp artisan migrate
定义可排队的任务类
用 Artisan 命令快速创建任务:
php artisan make:job SendWelcomeEmail在生成的 app/Jobs/SendWelcomeEmail.php 中,实现 handle() 方法。注意几点:
- 构造函数中只传入模型 ID 或简单标量值(避免序列化闭包或 request 对象)
- 在 handle() 中再通过 ID 查询模型(Eloquent 模型支持延迟加载)
- 添加 public $tries = 3; 控制最大重试次数
- 可选加 public $backoff = 60; 设置失败后首次重试延迟秒数
分发任务到队列
不直接 new + handle(),而是用 dispatch() 方法推入队列:
// 控制器中SendWelcomeEmail::dispatch($user->id)->delay(now()->addMinutes(5));
常见分发方式:
- ->delay($when):延迟执行(需 Redis 或 database 驱动支持)
- ->onConnection('redis'):指定连接(覆盖 .env 默认)
- ->onQueue('emails'):投递到指定队列名(如 emails、notifications)
- ->afterCommit():等数据库事务提交后再执行(防数据未写入就处理)
启动队列监听器并守护运行
开发时可用:
php artisan queue:work但生产环境必须用进程管理工具长期运行,否则终端关闭就停了。推荐:
- Supervisor(Linux 常用):配置自动重启、日志路径、进程数
- systemd(现代 Linux):写 .service 文件管理
- 不建议用 nohup & 或 screen —— 缺乏健康检查和自动恢复
同时开启多个队列监听器可提升吞吐,例如分别监听 emails 和 reports 队列:
php artisan queue:work --queue=emailsphp artisan queue:work --queue=reports
基本上就这些。配对驱动、写好任务、正确分发、守护运行——四步走稳,队列就不只是“能用”,而是真正扛住业务压力的后台引擎。










