ThinkPHP 8.0 配置 Redis 缓存驱动的核心是手动填全 config/cache.php 中 host、port、database、password/auth、timeout、persistent 等全部参数,否则会静默降级为 file 驱动;.env 中 CACHE_STORE=redis 仅作开关,不解析 REDIS_HOST 等变量;session 与 cache 必须隔离 database,且需禁用 PHP 原生 session GC。

ThinkPHP 8.0 配置 Redis 缓存驱动,核心不是“开了开关”,而是手动填全所有连接参数,否则会静默降级为 file 驱动——这是线上缓存失效最常被忽略的原因。
必须显式配置 config/cache.php 全部参数
`.env` 中的 CACHE_STORE=redis 只是启用开关,TP8 不读取 REDIS_HOST、REDIS_PORT 等环境变量。所有连接项必须硬编码写进 config/cache.php 的 stores['redis'] 数组里:
-
host:字符串,如
'127.0.0.1',不能留空或注释掉 -
port:整型,如
6379,写成字符串('6379')会导致连接失败 -
database:整型,如
0,必须明确指定,否则部分命令(如SET)可能报错 -
password 或 auth:Redis ≥6.0 启用 ACL 时用
'auth' => 'your-pass';传统模式用'password' => 'your-pass' -
timeout:建议 float 类型,如
3.0,避免连接卡死 -
persistent:高并发场景务必设为
true,减少 TCP 握手开销
session 和 cache 必须物理隔离
别依赖 prefix 区分 session 和 cache,key 冲突风险高。推荐做法是:
- cache 使用
database => 0 - session 使用
database => 1(需同步配在config/session.php的store数组中) -
config/session.php不仅要写'type' => 'redis',还必须完整声明'store' => [...],否则运行时报Call to a member function setOptions() on null
禁用 PHP 原生 session GC,防止误删登录态
在应用启动前(如 app/common.php 或中间件中)加入:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
立即学习“PHP免费学习笔记(深入)”;
ini_set('session.gc_probability', 0);
这样可避免 PHP 自带的垃圾回收机制扫描并删除 Redis 中的 session key,导致用户莫名登出。
验证 Redis 是否真正连通
别信日志没报错就等于连上了。最快验证方式:
- 执行
php think tinker - 输入:
(new \think\cache\driver\Redis(config('cache.stores.redis')))->handler()->ping() - 返回
+PONG才算通;返回false或异常,说明配置有误、密码错误或网络不通
典型静默降级现象:Cache::set('x', 'y') 返回 true,但 Cache::get('x') 返回 null。


















