ThinkPHP 8.0 关闭缓存需逐层处理:框架层(config/route/template)、驱动层(file/redis)、PHP 运行时层(OPcache);仅删文件或改配置无效,必须确认每层状态、清理并验证生效。

ThinkPHP 8.0 关闭缓存不是“一键禁用”能解决的事——它分三层:框架层(config、route、template)、驱动层(file/redis)、PHP 运行时层(OPcache)。关错一层,config() 还是返回旧值,route:cache 仍生效,页面还是不刷新。必须按层级逐个确认、清理、验证。
怎么确认当前缓存到底开没开?别信配置文件,看运行时
很多问题出在你以为关了,其实没生效。直接在控制器里加两行:
dump(config('app.debug'));<br>dump(is_file(runtime_path() . 'config.php'));
输出 true + false:说明 APP_DEBUG=true,框架跳过所有缓存,此时改代码应立刻生效;若仍不生效,问题在 OPcache 或文件权限。
输出 false + true:说明配置已走缓存,但 runtime/config.php 可能未更新或内容异常(比如空数组、语法错误)。
清 config 缓存的三个动作缺一不可
- 删文件:
rm -f runtime/config.php—— 仅删这一个不够,runtime/config/ 下可能还有子缓存 - 清命令:
php think config:clear—— 它会重置容器内缓存实例,比单纯删文件更彻底 - 重生成:
php think config:cache—— 必须在app_debug = false且 runtime/ 可写前提下执行,否则静默失败
⚠️注意:config:cache 成功后生成的 runtime/config.php 大小通常 ≥30KB;若只有几 KB,大概率是解析失败(比如 .env 里 CACHE_STORE=redis 覆盖了配置,但 Redis 连不上)。
立即学习“PHP免费学习笔记(深入)”;
OPcache 不重置,改完 config/app.php 也没用
即使 runtime/config.php 已更新,config('app.app_name') 还是旧值?极大概率是 OPcache 把刚改过的 config/app.php 或 runtime/config.php 编译结果锁在共享内存里了。
- 开发环境:设
opcache.validate_timestamps=1且opcache.revalidate_freq=0,再访问含opcache_reset()的临时脚本 - 生产环境:不能依赖自动检测,每次部署后必须
systemctl reload php-fpm或调用opcache_reset() - 验证是否生效:
var_dump(opcache_get_status()['opcache_statistics']['opcache_hit_rate']);hit rate 接近 100% 才算真正预热成功
模板、路由、模型缓存各自独立,clear --all 压根不管它们
php think clear --all 只清 cache/ 目录和 Redis 中带默认 prefix 的 key,以下全不碰:
- 模板缓存:存在
runtime/view/,必须加-t参数:php think clear -t - 路由缓存:存在
runtime/cache/route.php,得用php think clear:route - 模型查询缓存:比如
UserModel::cache(true)->select()生成的 key,只能手动删 Redis key 或调Db::clearCache()
最稳妥的绕过法:临时把 config/cache.php 的 default 改成 'null',重启服务,看问题是否消失——这比猜哪个缓存没清干净快得多。
真正麻烦的从来不是“怎么关”,而是“关哪一层”和“关完有没有被下一层兜底”。TP8.0 的缓存是嵌套加载的:OPcache → 框架 config 缓存 → 驱动缓存 → 模板编译缓存。漏掉任意一环,你看到的就只是“假刷新”。



















