当前应使用phpredis而非predis:需卸载predis、安装phpredis扩展、设REDIS_CLIENT=phpredis、清配置缓存,并验证config('database.redis.client')返回"phpredis"且Redis::ping()正常。

确认当前用的是 predis
执行 php artisan tinker,然后输入 config('database.redis.client')。如果返回 "predis",说明当前走的是 Predis;若已为 "phpredis",跳过这步。多数 Laravel 9x 新项目默认用 predis/predis(通过 Composer 安装),但官方早已标记其为弃用 —— predis 不支持连接池,尤其在 Octane 或高并发队列场景下容易耗尽连接或报 Connection refused。
卸载 predis 并启用 phpredis 扩展
先删掉 Composer 包:composer remove predis/predis。再确保系统已装 phpredis 扩展:
- macOS + Homebrew:运行
brew install php-redis,然后检查php -m | grep redis是否有输出 - Docker 环境:在
Dockerfile中加RUN pecl install redis && docker-php-ext-enable redis - 验证是否生效:
php --ri redis应显示扩展信息,而非 “Extension 'redis' not present”
没装成功就别往下走 —— Laravel 会静默 fallback 回 predis(即使 REDIS_CLIENT=phpredis),且不报错。
改配置项并清缓存
修改 .env:
REDIS_CLIENT=phpredis REDIS_HOST=redis # Docker 下必须填服务名,不是 localhost REDIS_PORT=6379 REDIS_DB=0
同时检查 config/database.php 中 redis.client 是否被硬编码覆盖(比如写死成 'client' => 'predis')—— 如果有,删掉或改成 env('REDIS_CLIENT', 'phpredis')。改完立刻执行:
-
php artisan config:clear(关键!不执行这步,config('database.redis.client')仍读缓存旧值) -
php artisan cache:clear(辅助清理)
再进 tinker 验证:config('database.redis.client') 必须返回 "phpredis",且 Redis::ping() 能返回 +"PONG"。
队列和缓存驱动要分别确认
QUEUE_CONNECTION=redis 和 CACHE_DRIVER=redis 都依赖底层 Redis client,但它们各自走不同路径:
- 队列驱动读
config/queue.php的redis.connection,它最终映射到config/database.php的redis.default连接 —— 所以只要 client 和 default 配置对,队列就能用 - 缓存驱动读
config/cache.php的stores.redis.connection,默认也是default,但如果你显式设了cache连接(比如database.redis.cache),就得同步改它的client值 - Octane 用户注意:
phpredis必须配connection_pool,否则启动时报Connection pool is required for phpredis in Octane;在config/database.php的redis.options加'connection_pool' => ['max_connections' => 20]
最常被忽略的是:改了 .env 没清 config 缓存,或以为删了 predis 就自动切过去,结果 Laravel 仍在用 fallback 逻辑兜底 —— 它不会告诉你失败,只会让你的队列卡住、缓存不生效、Session 读写异常。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











