tp8升级后redis连接异常的根源是配置迁移遗漏关键字段:session配置须移至config/app.php并完整填写redis_config,cache.php需硬编码参数且忽略.env变量,acl模式下密码字段名改为auth,扩展包需重装。

升级到 TP8 后 Redis 缓存连接异常,不是因为 TP6 和 TP8 的驱动不兼容,而是配置迁移时漏掉了几个关键字段或写法变化——尤其 config/session.php 和 config/cache.php 的结构差异、redis_config 的位置、以及 ACL 模式下密码字段名变更,最容易导致“连不上却没报错”的静默失败。
TP8 的 session 配置必须从 config/app.php 重写,不能沿用 TP6 的 config/session.php
TP6 中 session 的 Redis 配置还能放在 config/session.php,但 TP8 已完全废弃该文件。如果你升级后没动 config/app.php,而只是把旧配置复制过去,会直接 fallback 到 file 驱动:
-
config/app.php中的'session'数组必须包含'type' => 'redis'和完整的'redis_config' => [...] -
redis_config里键名是'hostname'、'hostport'、'password'(或'auth'),不是'host'/'port'/'password' - 若 Redis ≥6.0 且启用了 ACL,
'password'要换成'auth',并确认用户有+@all权限;否则set类命令静默失败 - 漏掉
'redis_config'或写成空数组,运行时会抛出Call to a member function setOptions() on null
cache.php 的 stores.redis 必须显式填全参数,.env 里的 REDIS_* 完全无效
TP8 不读取 .env 中的 REDIS_HOST、REDIS_PORT 等变量,只认 config/cache.php 里 stores['redis'] 数组中硬编码的值。常见漏项包括:
-
'host' => '127.0.0.1'(不能注释或留空,无默认值) -
'port' => 6379(必须是整型,"6379"会失败) -
'database' => 0(必须指定,否则部分命令如select报错) -
'timeout' => 3.0(建议 float,避免连接卡死) -
'persistent' => true(高并发下不加会导致连接数暴涨)
扩展包要重装,think-redis 和 think-session 不能共用一个配置
TP6 和 TP8 都不再内置 Redis 驱动,但升级后容易忽略两点:
- 必须重新执行
composer require topthink/think-redis(缓存)和composer require topthink/think-session(session),旧版本的 autoload 可能失效 -
think-redis的配置在config/cache.php,think-session的配置在config/app.php,二者不共享、不继承,也不能靠Cache::store('redis')的配置自动注入 session - 没装
think-session,哪怕config/app.php写得再全,也会静默降级为 file session,现象是“登录后刷新即登出”
验证是否真连上,别信 Cache::set() 返回 true
Cache::set() 返回 true 只代表“写入操作被接受”,不代表数据进了 Redis。真正验证方式只有一个:
- 运行
php think tinker - 执行
(new \think\cache\driver\Redis(config('cache.stores.redis')))->handler()->ping() - 返回
+PONG才算通;返回false或异常,说明 host/port/database/auth/timeout 至少有一项不对 - 如果 ping 通但
Cache::get()仍返回null,先关掉'prefix'(设为''),再用redis-cli手动get键名,确认是不是前缀或序列化不一致
最常被忽略的是:TP8 对连接失败采取静默兜底策略,首次失败记日志,后续复用连接池失败则完全无提示。所以不能只看有没有报错,得亲手 ping 一次。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











