先确认phpredis扩展已启用:执行php -m | grep redis,无输出说明未加载,需在php.ini中添加extension=redis.so并重启PHP-FPM(非仅重载);同时确保Laravel的config/database.php中'client' => 'phpredis'与实际安装一致,且.env、database.php、queue.php三处Redis配置完全对齐。

确认 phpredis 扩展已启用且与配置匹配
用 php -m | grep redis 检查输出中是否有 redis,没有就说明扩展没加载。此时需在 php.ini 中添加 extension=redis 并重启 PHP-FPM(不是仅 reload)。Laravel 10 默认倾向使用 phpredis,但若你项目里 composer 安装了 predis/predis,又在 config/database.php 里把 'client' => 'predis' 写死了,queue:work 启动时会直接报 ClassNotFound——因为 Laravel 尝试实例化 Predis 客户端,而你实际只装了 phpredis。
关键点:config/database.php 中 redis 连接块的 'client' 值必须和真实安装的扩展一致:
- 只装了 phpredis →
'client' => 'phpredis' - 只装了 predis →
'client' => 'predis' - 两者都装?别这么干。选一个,删另一个,再清缓存
三处配置必须完全对齐:.env、database.php、queue.php
很多人改完 .env 就以为完事,结果任务 dispatch 成功却没人消费——根本原因是三处连接参数不一致,Laravel 静默 fallback 到默认值或空配置,连错误日志都不写。
逐项核对:
立即学习“PHP免费学习笔记(深入)”;
-
.env必须显式设四行:QUEUE_CONNECTION=redis、REDIS_HOST=10.0.0.5、REDIS_PORT=6380、REDIS_PASSWORD=null(无密码也得写null,空字符串会触发 AUTH 失败) -
config/database.php的redis.default块中:'database' => 1(避免和缓存共用 db0)、'timeout' => 5、'read_write_timeout' => -1(防长任务阻塞后永久失联) -
config/queue.php的redis连接块中:'connection' => 'default'必须和database.php里定义的键名完全一致;'queue' => 'prod:notifications'建议带命名空间前缀,隔离环境
任务类不能传模型实例,要传 ID + 在 handle() 里查
这是 Laravel 10 + phpredis 下最常导致序列化失败的坑。phpredis 对 Closure、resource、未加载关系等更敏感,serialize() 一个完整 User 模型可能直接抛 Serialization of 'Closure' is not allowed。
正确做法是:
- 分发时只传 ID:
SendEmailJob::dispatch($user->id) - 任务类构造函数接收 ID,存为属性:
$this->userId = $userId -
handle()里重新查:$user = User::findOrFail($this->userId) - 如果非要传模型,必须加
use SerializesModels;,且确保构造时没调用load()或访问器触发 DB 查询
queue:work 必须由 Supervisor 守护,不能裸跑
php artisan queue:work 是前台进程,SSH 断开就死;加 --daemon 也扛不住内存泄漏或 PHP 扩展崩溃——它不会自重启,任务就卡在 Redis 里不动。
Supervisor 配置至少含三项:
-
autostart=true(开机自启) -
autorestart=true(崩溃自动拉起) -
startsecs=3(启动后稳定运行 3 秒才算成功)
推荐加运行约束参数:php artisan queue:work --timeout=60 --tries=3 --max-jobs=100。尤其 --max-jobs=100 能强制 worker 重启,释放长期累积的内存。
最后别忘了每次改配置后执行 php artisan config:clear,否则 .env 和 config/ 文件的改动全白搭——这个步骤在生产环境最容易被跳过。



















