ThinkPHP 8.0 的 Redis 缓存不会自动生效,必须在 config/cache.php 和 config/session.php 中显式配置 host、port、database、password(ACL 模式用 auth)、timeout、persistent 等完整参数,.env 中的 CACHE_STORE 或 REDIS_HOST 等仅作开关或完全无效;cache 与 session 需用不同 database 或严格区分 prefix,否则 key 空间冲突;连接失败时静默降级至 file,导致登录态丢失或缓存失效等隐蔽问题。

ThinkPHP 8.0 的 Redis 缓存不会自动生效,CACHE_STORE=redis 这类 .env 配置只是开关,真正起作用的是 config/cache.php 里显式写的连接参数——漏填 host、port 或 database,缓存就会静默 fallback 到 file 驱动。
cache.php 必须显式写全 Redis 连接参数
TP8 不从 .env 解析 REDIS_HOST、REDIS_PORT 等键名,这些变量完全被忽略。你必须在 config/cache.php 的 'stores' => ['redis' => [...]] 数组中逐项填写:
-
'host' => '127.0.0.1'(不能省略,默认值不生效) -
'port' => 6379(整型,不是字符串) -
'database' => 0(必须指定,否则部分命令报错) -
'password' => 'your-pass'(ACL 模式下改用'auth' => 'your-pass') -
'timeout' => 3.0(建议设为 float,避免连接卡死) -
'persistent' => true(高并发下务必开启长连接,否则握手开销吃掉 QPS)
session.php 同样要配 store 数组,不能只设 type
config/session.php 中如果只写 'type' => 'redis',但 'store' 键留空或缺失,运行时会直接报错:Call to a member function setOptions() on null。正确写法是:
- 必须补全
'store' => ['host' => '127.0.0.1', 'port' => 6379, 'database' => 1, ...] -
cache和session强烈建议用不同database(如 cache 用 0,session 用 1),比前缀更可靠 - 若共用 database,必须加
'prefix' => 'sess_',且确认cache的 prefix 是'cache_',两者不能重叠 - 禁用 PHP 原生 session GC:
ini_set('session.gc_maxlifetime', 0),否则 Redis 中的 session key 可能被误删
Redis 连接失败时不会报错,只会降级到 file
这是最隐蔽的问题:缓存/登录态看似正常,实则没走 Redis。典型现象包括“登录后刷新即登出”“Cache::set() 成功但 get() 返回 null”。排查方法:
立即学习“PHP免费学习笔记(深入)”;
- 开启 debug 模式后,在
runtime/log/里搜RedisException或Connection refused(注意:仅首次连接失败记日志) - 手动测试连接:
php think tinker→(new \think\cache\driver\Redis(['host'=>'127.0.0.1']))->get('test') - 检查
php -m | grep redis确认扩展已加载,且版本 ≥ 5.3.7(PHP 8.0 必需) - 宝塔用户注意:PHP 8.0 下不能靠面板一键安装 Redis 扩展,必须用
pecl install redis-5.3.7手动编译
性能关键点:长连接 + 正确的 database 隔离
TP8 默认使用短连接,每请求重建 TCP,QPS 上不去。真实压测中,'persistent' => true 可提升 3–5 倍吞吐。但要注意:
- FPM 模式下,长连接归属 Worker 进程,重启 PHP-FPM 才释放;Swoole 下需配合连接池管理
-
database隔离比prefix更彻底:Redis 的SELECT命令天然隔离 key 空间,无拼接风险 - 别信“TP8 默认带 prefix”——
think:xxx是Cache类自己拼的,sessionkey 完全是PHPSESSID_xxx,无任何默认前缀 - OPcache 必须开启,否则
php think optimize生成的缓存文件无法加速配置加载
最容易被忽略的是:cache 和 session 共用 database 且没加 prefix 时,Cache::tag('user')->clear() 会误删所有 key,包括 session 数据——这不是 bug,是 Redis 本身的设计使然。



















