TP6关闭模板编译缓存需设config/template.php中'cache_expire'=>0,清空runtime/view/目录;TMP_CACHE_ON已失效,HTML静态缓存默认未启用,还需检查路由、中间件缓存及浏览器缓存。

ThinkPHP6 关闭模板编译缓存:TMP_CACHE_ON 已失效,改用 template.cache_expire
TP6 彻底重构了模板引擎配置体系,TMP_CACHE_ON 这类 TP5 风格的常量或配置项不再生效。模板是否编译缓存,由 config/template.php 中的 cache_expire 控制。
实操建议:
- 打开
config/template.php,将'cache_expire' => 3600改为'cache_expire' => 0(值为 0 表示禁用缓存,每次请求都重新编译) - 别只改
env或app.php—— 模板相关配置只在template.php生效 - 改完后清空
runtime/template/目录,否则旧缓存文件仍可能被读取 - 注意:设为
-1并非“永久”,而是沿用文件修改时间判断;真正要禁用,必须用0
禁用 HTML 静态缓存:html_cache_on 是开关,但 TP6 默认根本没开
TP6 移除了内置的 buildHtml 和全局 HTML 静态缓存机制。所谓「关闭 HTML 缓存」,本质是确认它没被意外启用。
检查点:
立即学习“PHP免费学习笔记(深入)”;
- 确认
config/app.php中没有'html_cache_on' => true这类自定义配置(TP6 官方配置项里压根没有这个键) - 搜索项目代码,看是否手动引入了第三方静态化扩展(比如某些老项目迁移时保留了 TP5 的
HtmlCache行为) - 如果你在控制器里调用了
$this->fetch()后又执行了exit或redirect(),那不是缓存问题,是输出中断——这会导致页面空白,容易误判为「缓存没刷新」
调试阶段最该关的是路由与中间件缓存:route_cache_file 和 middleware.cache
本地改了路由规则或中间件逻辑却没生效?大概率是路由缓存或中间件注册缓存没清。
实操建议:
- 在
config/route.php中设置'cache_file' => false(默认是true,会生成runtime/route/下的缓存文件) - 检查
config/middleware.php是否启用了think\middleware\Cache类中间件;如有,临时注释掉整段注册逻辑 - 运行
php think clear:route和php think clear:middleware命令(TP6.1+ 支持),比手动删runtime/更精准 - 别忽略
.env文件里的APP_DEBUG=true—— 它虽不直接控制缓存,但设为false时 TP6 会自动开启多项缓存,默认行为会变
为什么清了 runtime 还有旧内容?你可能漏掉了视图驱动层的磁盘缓存
TP6 默认使用 think\template\driver\File,它的缓存路径和模板编译路径是分离的。即使关了模板缓存,视图驱动仍可能把 fetch() 结果写进 runtime/view/。
关键动作:
- 删除整个
runtime/view/目录(不只是template/) - 检查
config/template.php中的'view_path'配置,确认没指向一个意外的、带缓存的共享路径 - 如果用了自定义视图驱动(比如 Redis 存储渲染结果),需单独清理对应存储源,
runtime目录下找不到痕迹 - 浏览器 F5 刷新无效?试试 Ctrl+F5 强制重载,或关掉 DevTools 的 “Disable cache” 开关——有时候你以为是 PHP 缓存,其实是浏览器把 304 响应当真了
runtime/ 下至少有 template/、view/、route/、log/ 四个独立缓存区,各自开关和清理方式都不一样。



















