缓存驱动未生效的典型表现是页面数据长期不更新、Cache::get()总返回旧值、日志无读写记录;根本原因是driver被设为null/''/拼写错误导致退化为“无缓存”模式,或file驱动权限不足、redis配置中prefix冲突/expiry为0/host解析失败。

缓存驱动未生效的典型表现
页面数据长期不更新,哪怕手动清空 runtime/cache/ 目录也无效;Cache::get() 总是返回旧值,Cache::set() 后立刻 get() 却拿不到;日志里看不到缓存读写记录。这些不是代码逻辑问题,而是缓存驱动根本没跑起来。
检查 cache.php 配置中 driver 是否被意外覆盖
ThinkPHP 6 默认使用 file 驱动,但很多项目会复制一份 cache.php 到 config/app.php 或环境配置里,结果 driver 被设成 null、'' 或拼写错误的 'fle' —— 这会导致框架退化为“无缓存”模式,所有 Cache::* 调用静默失败,不报错也不执行。
- 确认
config/cache.php中'default' => 'file'且对应'file'驱动配置存在 - 检查
config/app.php是否有'cache' => [...]覆盖项,它会完全替代 cache.php - 运行
php think env:debug(或输出Config::get('cache'))验证最终生效的配置
File 驱动下 runtime/cache 权限与路径问题
file 驱动依赖 runtime/cache/ 目录可写,但常因部署方式出问题:Docker 容器内该目录属 root、Nginx 用户无权限、或 runtime 被挂载为只读卷。
- 执行
ls -ld runtime/cache确认 Web 进程用户(如 www-data、nginx)有w权限 - 若用
php think cache:clear提示 “Permission denied”,说明驱动已加载但写入失败 - 不要手动
rm -rf runtime/cache/*,应改用php think cache:clear,它会触发驱动自身的清理逻辑 - 避免将
runtime设为软链到不可写位置(如 /tmp),File 驱动不处理跨文件系统场景
Redis 驱动连接成功但缓存不生效的隐藏原因
即使 redis 驱动配置正确、Ping 通,仍可能不生效:默认 'prefix' 是空字符串,多个应用共用同一 Redis 实例时 key 冲突;或 'expire' 设为 0 导致部分版本驱动跳过写入;更常见的是 'host' 配成了 127.0.0.1,而容器内 PHP 无法解析本地回环(需改 host.docker.internal 或宿主机 IP)。
立即学习“PHP免费学习笔记(深入)”;
- 用
redis-cli --scan --pattern "tp6_*"(假设 prefix=tp6_)确认 key 是否真实写入 - 检查
'expire'值是否为正整数,0在某些驱动版本中等价于“不缓存” - 在控制器中临时加
dump(Cache::store('redis')->handler());看是否返回 Redis 对象,而非null



















