必须同时清除runtime/temp和runtime/view目录,因ThinkPHP5模板缓存为双层结构:temp存编译PHP文件,view存哈希映射文件;仅清temp会导致框架复用旧view缓存而报错。

模板缓存删了 runtime/temp 还报错?因为 runtime/view 也得清
ThinkPHP5 的模板编译缓存是双层结构:一层是 runtime/temp/ 下的 PHP 编译文件(如 template_abc123.php),另一层是 runtime/view/ 下的视图哈希映射文件(如 index[md5].php)。只删 temp,框架仍会从 view 目录读取旧哈希,跳过重新编译,继续执行损坏的缓存代码。
实操建议:
- 开发阶段务必同时清空两个目录:
rm -rf runtime/temp/* runtime/view/* - 别用
glob(TEMP_PATH . '*.php')只删 .php 文件——temp里还有空子目录,残留目录会导致后续编译失败 - 清完立刻访问页面,看是否生成新的
runtime/view/xxx.php;没生成说明模板路径或后缀配置有误
php think clear --temp 不清 runtime/view?对,它只清 temp
php think clear --temp 是 ThinkPHP5 内置命令,但它只清理 runtime/temp/ 目录,完全不碰 runtime/view/。这是最常被忽略的兼容性断层:TP5.0 和 TP5.1+ 的模板缓存路径逻辑不同,但命令行为没同步更新。
常见错误现象:
立即学习“PHP免费学习笔记(深入)”;
- 执行
php think clear --temp后,模板语法改了仍报Template compile error - 日志里显示 “compiling template xxx” 却没生成新文件,说明
view目录里的哈希没变,编译被跳过 - 在多应用模式下,
runtime/appname/temp/和runtime/appname/view/都要手动处理,--temp不识别应用前缀
Cache::clear() 对模板缓存无效?没错,它根本不碰模板
Cache::clear() 清的是数据缓存驱动(如 runtime/cache/ 或 Redis 中的键值),和模板引擎完全无关。模板缓存由 \think\template\driver\File 独立管理,生命周期、路径、失效逻辑都和 think\Cache 体系隔离。
所以这些写法都没用:
-
Cache::clear()—— 清的是 cache/,不影响 view/ 或 temp/ -
Cache::store('file')->clear()—— 还是清 cache/,除非你把模板驱动配到同一个 store 名下(不推荐) -
Db::clearCache()—— 这是查数据库的查询缓存,和模板零关系
真正该调用的是模板引擎自己的清理入口:\think\facade\View::engine()->clear(),但 TP5 没暴露这个方法,所以只能手动删目录。
为什么删完还是渲染空白?检查 template.cache_lite 和 app_debug
删了所有缓存文件仍出问题,大概率卡在两个隐藏开关上:
-
template.cache_lite设为true(默认)时,每次渲染都会filemtime()检查原始模板是否变更。若模板放在 NFS、Docker volume 或权限受限目录,这个 stat 调用可能超时或失败,导致静默跳过编译,输出空白 -
app_debug = true时,框架会禁用模板缓存,但某些中间件或钩子可能提前触发了编译逻辑,留下半截缓存文件;而生产环境app_debug = false后,又因缓存未刷新而复用坏文件
验证方式:临时在 config/template.php 里加 'cache_lite' => false,再删一次 runtime/view/ 和 runtime/temp/;如果页面恢复,就确认是 cache_lite 导致的 IO 阻塞。



















