ThinkPHP 6.1 静态缓存不生效主因是未真正进入缓存流程:一、模板缓存未生成,因配置错误或路径无效;二、缓存被清空或权限不足;三、校验逻辑失效或 OPcache/反向代理干扰;四、手动清除后因错误未重建。

ThinkPHP 6.1 的静态缓存(即模板编译缓存)不生效,通常不是“没启用”,而是被绕过、被误删、或根本没生成——关键在 是否真正进入缓存流程,而非单纯看 runtime/view/ 下有没有文件。
一、模板缓存压根没生成
常见于开发环境配置未对齐:
- 检查 config/template.php 中
'cache' => true是否为布尔值 true(不能是字符串 "true") - 确认
'view_path'指向的是真实存在的模板目录(如app/view/),且路径末尾无多余斜杠 - 若使用多应用模式,确保路由和控制器正确加载对应应用的模板路径,否则框架会 fallback 到默认 view 目录甚至报错退出,跳过缓存环节
二、缓存文件被频繁清空或权限异常
即使生成了,也可能刚写入就被干掉:
- runtime/view/ 目录必须由 Web 进程用户(如 www-data 或 nginx)可写;若用 root 执行过 php think clear 或部署脚本,后续 PHP 进程可能因权限不足无法写入或覆盖,导致每次请求都重新编译
- 检查是否有定时任务、CI/CD 脚本或 IDE 同步工具在后台执行
rm -rf runtime/view/—— 这会让缓存形同虚设 - Linux 下注意 SELinux 或 AppArmor 限制,某些安全策略会阻止 PHP 写入 runtime 子目录
三、缓存校验逻辑被干扰
TP6 默认开启时间戳比对,但配置不对就失效:
立即学习“PHP免费学习笔记(深入)”;
-
'cache_time' => 0表示强制每次检查模板修改时间,这是开发阶段最推荐的值;设为 null、字符串 "0" 或负数都会导致跳过校验,反而可能读到旧编译文件 - 若启用了 OPcache,且 template 编译后的 PHP 文件(如
runtime/view/xxx/yyy.php)被 OPcache 缓存,而 OPcache 的validate_timestamps=0,那改了模板也看不到效果——需同步检查 OPcache 配置 - Nginx/Apache 若配置了 aggressive fastcgi_cache 或 proxy_cache,并缓存了整个 HTML 响应,那框架层的模板缓存是否生效已无关紧要,用户看到的只是反向代理返回的旧页面
四、手动清除后没触发重建
删了 runtime/view/ 不等于缓存立刻回来:
- 删除后首次访问页面时,框架才开始编译并生成新缓存;若此时模板语法错误、include 路径不存在或 PHP 报错中止,缓存文件就不会落地
- 建议删完后,用 curl 或 Postman 直接请求一个纯模板渲染接口(如
/index/index),观察 response 和 runtime/view/ 是否出现新增子目录及 .php 文件 - 可在模板里临时加
{:dump(\think\facade\App::debug())}确认是否处于调试模式——APP_DEBUG=true 时,部分缓存行为会被跳过



















