必须确保环境、配置、依赖、启动命令四者严丝合缝:.env设QUEUE_CONNECTION=redis及Redis连接参数,config/database.php与config/queue.php中redis.default配置严格一致,安装predis/predis,启动命令为php artisan queue:work redis,任务类实现ShouldQueue并使用四大trait,生产环境用Supervisor守护进程。

要让 Laravel 队列真正通过 Redis 异步运行,光写 dispatch() 或实现 ShouldQueue 不够——必须确保环境、配置、依赖、启动命令四者严丝合缝。错一个环节,任务就静默积压、无日志、不执行。
Redis 驱动基础配置必须对齐三处
QUEUE_CONNECTION=redis 这行配置只是“开关”,它实际指向的是 config/queue.php 中 connections['redis'] 的整套定义;而这个定义里的 connection => 'default',又必须和 config/database.php 里 redis['default'] 的 host/port/password 完全一致。
-
.env 中确认:
QUEUE_CONNECTION=redisREDIS_HOST=127.0.0.1(或真实地址)REDIS_PORT=6379REDIS_PASSWORD=null(若设了密码,这里不能留空或漏配)REDIS_CLIENT=predis(显式声明,避免 fallback 到未启用的 phpredis) -
config/database.php 中检查
redis.default是否可连:用redis-cli -h $REDIS_HOST -p $REDIS_PORT ping手动验证通不通 -
config/queue.php 中确认 redis 连接块的
connection键值与 database.php 里的键名完全相同(比如都是default)
依赖与启动命令必须匹配驱动类型
Redis 驱动不是开箱即用,Laravel 默认不带 Redis 客户端。不装扩展、不写对命令,worker 根本连不上 Redis。
- 执行
composer require predis/predis:^1.0——这是最稳妥的选择;如果用 phpredis,需确认extension=redis已在 php.ini 启用 - 启动监听必须带参数:
php artisan queue:work redis(不能省略redis,也不能写成database或不加) - 开发调试加
--verbose:看控制台是否输出Processing或Failed,没日志大概率是连接失败或队列名不匹配
任务类必须满足序列化安全要求
哪怕配置全对,任务类写法不对也会导致进不了队列,或卡在 Redis 里无法反序列化。
- 类声明必须包含
implements ShouldQueue(只 use trait 不算数) - 必须引入四个 trait:
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;,尤其SerializesModels缺一不可 - 构造函数里别传 Eloquent 模型实例,改传 ID:
public function __construct($userId) { $this->userId = $userId; },然后在handle()里查库 - 避免闭包、资源句柄、未序列化的对象;检查
storage/logs/laravel.log是否有Serialization of 'Closure'报错
生产环境必须用 Supervisor 管理进程
手动运行 queue:work 在终端关闭后就停了,这在生产中不可接受。Supervisor 能自动拉起崩溃的 worker、限制内存、支持多进程并发。
- Supervisor 配置中
command必须明确指定驱动:php artisan queue:work redis - 务必在
environment字段显式传递所有必要环境变量(如APP_ENV=production,QUEUE_CONNECTION=redis),否则 worker 会读取不到 .env 配置 - 不推荐
queue:listen:它已被 Laravel 弃用,每次任务都启新进程,开销大且不稳定 - 高阶替代方案可选 Horizon:仅限 Redis,提供监控、重试、自动伸缩,安装后直接运行
php artisan horizon



















