TP8的Redis配置必须手动在cache.php中完整填写host、port、database等参数,.env中的REDIS_*变量仅控制驱动开关;session.php需单独配置Redis且与cache隔离database;schema缓存路径已变更为runtime/cache/schema/,需清理旧路径并重生成。

TP8 的 cache.php 必须手动填全 Redis 连接参数
TP8 不会从 .env 读取 REDIS_HOST、REDIS_PORT 等字段,这些变量只控制开关(如 CACHE_DRIVER=redis),不参与连接构建。一旦 config/cache.php 中的 stores['redis'] 缺少任意必填项,就会静默降级为 file 驱动——你调用 Cache::set() 成功,但 get() 返回 false,日志里还看不到报错。
必须显式写明以下字段:
-
host、port、database(不能留空或注释掉,'database' => 0得写全) - 若 Redis ≥6.0 启用 ACL,用
auth替代password,且确认用户有+@all权限 -
timeout建议设为3(连接超时秒数),别用0;expire是缓存默认过期时间,按业务设(如3600)
session.php 和 cache.php 的 Redis 配置不能复用
TP8 的 session Redis 驱动不共享 cache.php 配置,只写 'type' => 'redis' 会直接抛出 Call to a member function setOptions() on null。你得在 config/session.php 里单独补全 store 数组。
更关键的是:cache 和 session 应该隔离 database,比如:
- cache 用
database => 0 - session 用
database => 1
比加 prefix 更可靠——Redis 的 SELECT 命令在连接池复用场景下可能失效,database 隔离是硬隔离。
顺手禁用 PHP 原生 GC:ini_set('session.gc_probability', 0),否则 Redis 里过期的 session 可能被误删,用户莫名登出。
schema 缓存路径变更导致 optimize:schema 失效
TP8 把 schema 缓存路径从 runtime/schema/ 改成了 runtime/cache/schema/。如果你是从 TP6 升上来的,旧缓存文件还在原处,系统会优先加载它——哪怕你刚跑完 php think optimize:schema,也毫无效果。
验证和修复步骤:
- 删干净两个路径:
rm -rf runtime/schema/ runtime/cache/schema/ - 再执行
php think optimize:schema - 检查生成的文件是否落在
runtime/cache/schema/下,且内容是 PHP 数组(非空)
不清理旧缓存,SHOW COLUMNS 查询就照常执行,优化等于白做。
缓存驱动切换后务必验证是否真连上 Redis
TP8 对 Redis 连接失败采取“静默兜底”策略:首次失败记日志(搜 RedisException 或 Connection refused),后续请求完全不提示,直接切到 file。线上最常见现象就是登录态维持不住、接口响应忽快忽慢。
最快验证方式:
- 运行
php think tinker - 执行
(new \think\cache\driver\Redis(config('cache.stores.redis')))->handler()->ping() - 返回
+PONG才算通;返回 false 或报错,说明配置或网络有问题
别信 Cache::set() 返回 true 就代表成功——它只表示“写入缓存驱动成功”,而驱动本身可能早已 fallback 到 file。











