TP8升级必须强制修改Redis配置:cache需在config/cache.php显式写全host/port/database/auth等参数,session需在config/session.php配置完整store数组,否则静默降级为file驱动,导致缓存写入失败、登录态丢失。

需要改,而且改动是强制性的——TP8 的缓存驱动不兼容 TP6 的配置方式,漏改会导致 Redis 静默降级为 file,现象就是“缓存写了但读不出来”“登录态一刷就丢”。
config/cache.php 必须显式填全 Redis 参数
TP8 不再从 .env 读取 REDIS_HOST、REDIS_PORT 等变量,这些字段在 TP8 中完全被忽略。你必须在 config/cache.php 的 'stores' => ['redis' => [...]] 里逐项写死:
-
'host' => '127.0.0.1'(不能留空或依赖默认值) -
'port' => 6379(必须是整型,字符串会报错) -
'database' => 0(必须显式指定,否则 phpredis 可能连错库) -
'password' => 'xxx'或 ACL 模式下用'auth' => 'xxx'(Redis ≥6.0 且启用了用户权限时) -
'timeout' => 3.0(建议 float 类型,避免连接卡死)
session.php 同样要配 store,不能只设 type
TP6 允许只写 'type' => 'redis',TP8 则要求 config/session.php 中必须包含完整 'store' 数组,否则运行时报 Call to a member function setOptions() on null:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 错误写法:
'type' => 'redis'(无store键) - 正确写法:
'store' => ['host' => '127.0.0.1', 'port' => 6379, 'database' => 1, 'auth' => 'xxx'] - cache 和 session 强烈建议用不同
database(如 0 和 1),比加prefix更可靠
连接失败不报错,但功能悄悄失效
TP8 对 Redis 连接失败采用静默兜底策略:首次失败会记日志(搜 RedisException 或 Connection refused),后续请求直接 fallback 到 file 驱动,毫无提示。
立即学习“PHP免费学习笔记(深入)”;
- 典型现象:
Cache::set('foo', 'bar')返回 true,但Cache::get('foo')返回null - 验证是否真连上:
php think tinker后执行(new \think\cache\driver\Redis(config('cache.stores.redis')))->handler()->ping(),返回+PONG才算通 - 务必禁用 PHP 原生 session GC:
ini_set('session.gc_probability', 0),否则 Redis 中的 session key 可能被误删
最常被忽略的是 runtime 目录隔离和 cache/session database 分离——哪怕配置全对,共用同一个 Redis DB 或 runtime 缓存目录,也会导致 key 冲突或 session 覆盖,问题藏得深、复现难。


















