ThinkPHP 5 缓存不生效主因是配置未到位、路径不可写、驱动未加载或缓存根本未写入;须确认config/cache.php正确配置、runtime/cache可写、APP_DEBUG=false、开启缓存日志并用Cache::has()/get()验证。

ThinkPHP 5 缓存不生效,多数不是代码写错了,而是配置没到位、路径不可写、驱动未加载,或者你以为缓存写了,其实压根没存进去。先别删文件、别改逻辑,按顺序排查这几个关键点,90% 的问题当场解决。
确认缓存配置已正确写入 config/cache.php
TP5 不再从 config/app.php 或 config.php 主文件读缓存配置,必须单独建 config/cache.php 并返回完整数组:
- 文件必须存在,且不能是空文件或只写了一半配置
- 'type' => 'File'(小写 file 也行,但大写 File 会失败)
- File 驱动必须指定 'path' => runtime_path() . 'cache/',且该路径要绝对有效
- Redis 驱动需同时满足:phpredis 扩展已启用、'host' 和 'port' 不为空、'password' 显式设为字符串(哪怕为空也要写
'')
检查 runtime/cache 目录是否真正可写
缓存写不进磁盘,是最隐蔽也最常被忽略的原因:
- 执行
touch runtime/cache/test_write,看是否报 Permission denied - Linux/macOS 下确保 Web 进程用户(如 www-data、nginx)对该目录有 rwx 权限
- Windows 下注意 IIS_IUSRS 或 Users 组是否被授予“完全控制”
- CentOS 上若启用了 SELinux,需临时执行
setenforce 0测试是否由此导致
验证缓存是否真的被调用和写入
别只信 Cache::set() 没报错,就以为成功了:
立即学习“PHP免费学习笔记(深入)”;
- 在控制器中加
dump(cache('test_key', 'ok', 60)); dump(cache('test_key'));,两次都应输出"ok" - 开启缓存日志:
'logger' => 'cache'加到 config/cache.php,并确认runtime/log/cache/可写 - APP_DEBUG=true 时,TP5 默认跳过缓存写入——务必检查
config('app.app_debug')是否为 false - 用
Cache::has('key')和Cache::get('key')分开判断,避免把null误认为“缓存失效”
清除缓存别只靠 Cache::clear()
这个方法只清内存索引,对 File 驱动的磁盘文件毫无影响:
- 开发阶段直接运行命令:
php think clear --cache(TP5.1.14+ 支持) - 手动清理时,必须递归删除
runtime/cache/全部内容,包括子目录如7d/7d8a/ - Redis 场景下
Cache::clear()会执行 FLUSHDB,若和其他服务共用 DB,建议改用Cache::tag('user')->clear()



















