ThinkPHP 6+ 缓存未生效的主因是 default 配置未正确设置或 Redis 驱动静默降级为 file;需确认 config/cache.php 顶层存在 'default' => ['type' => 'redis'],并验证 Redis 连接实际被使用。

确认 cache.default 配置是否生效
ThinkPHP 6+ 的缓存驱动由 config/cache.php 中的 'default' => ['type' => 'redis'] 控制,但很多人改了 type 却没注意外层键名是否匹配。常见错误是把配置写在了 'stores' => ['redis' => [...]] 里,却忘了让 'default' 指向它——框架会默默 fallback 到 file 驱动。
检查点:
-
config/cache.php顶层必须有'default' => ['type' => 'redis'],不能只配'stores.redis' - 别在
app.php或中间件里调用ini_set('session.save_handler', 'files')类干扰代码,它可能污染整个运行时环境 - 执行
php think clear:config再试,避免旧配置缓存干扰
验证 Redis 连接是否真被使用
光看配置没错还不够。最直接的办法是临时加一行日志:在 cache.php 的 redis 配置里加个自定义字段,比如 'debug_tag' => 'used_at_' . time(),然后在业务中执行 Cache::get('test') 后立刻查 Redis:redis-cli KEYS "*test*"。如果 key 没出现,说明根本没走 Redis;如果 key 出现但值不对,可能是前缀或序列化问题。
更准的验证方式:
立即学习“PHP免费学习笔记(深入)”;
- 用
Cache::store('redis')->set('probe', 'ok', 10)强制指定 store,绕过 default 分支逻辑 - 在
vendor/topthink/framework/src/think/cache/driver/Redis.php的connect()方法开头加throw new \Exception('Redis connected');,看是否抛异常 - 检查
phpinfo()页面里是否有redis扩展已启用(不是redis.so文件存在就行,得确认 Loaded Extensions 里有)
检查多环境配置是否覆盖了 cache 驱动
ThinkPHP 不会自动按 APP_ENV 切换 cache.php,但很多人在 config/app.php 里硬编码了 'default' => 'file',或者在 config/cache.php 里写了 if (env('APP_ENV') === 'prod') { ... } 却漏掉了 else 分支,默认 fallback 就是 file。
典型陷阱:
-
config/cache.php里用了$_ENV['APP_ENV']而不是Env::get('APP_ENV'),导致生产环境读不到值,走默认分支 - 在
config/extra/下新增了cache.php,但框架只加载主目录下的cache.php,额外配置被忽略 - 部署时用了
php think build生成静态配置,但没重新 build,仍用着旧的缓存配置
Redis 驱动初始化失败后静默降级为 file
ThinkPHP 的 Redis 驱动在连接失败、扩展未启用、或参数格式错误(比如 port 写成字符串 '6379' 而非整数)时,不会报错,而是悄悄回退到 File 驱动——你看到页面正常,Cache::get() 也返回值,但数据其实全存在 runtime/cache/ 里。
排查建议:
- 把
'timeout' => 1和'host' => '127.0.0.1'显式写上,避免 DNS 解析卡住导致超时静默失败 - 在
config/cache.php中临时把'type'改成'xxx',看是否报错——如果不报,说明框架压根没加载这个配置文件 - 检查
runtime/log/下最近的error.log,搜索redis或connect,Redis 初始化失败通常会记一条 warning
runtime/cache/ 目录的写权限逼它暴露问题。



















