php think clear 默认不清理模板缓存,因其仅清除 runtime/cache/ 和 runtime/log/,而模板缓存位于 runtime/view/;需手动删除该目录或使用 TP6.1+ 的 php think clear:template 命令。

ThinkPHP 模板缓存没刷新,php think clear 为什么没用?
因为默认的 php think clear 只清 runtime/cache/ 和 runtime/log/,不碰模板缓存目录。模板缓存实际存在 runtime/view/ 下,是独立路径,得手动指定。
-
php think clear是通用清理命令,不区分缓存类型,也不读取模板引擎配置里的缓存路径 - ThinkPHP 5.1+ 默认用
think\template\driver\File,模板编译后生成 PHP 文件,放在runtime/view/xxx/(xxx 是哈希目录名) - 如果改了模板但页面没变,大概率是
runtime/view/里旧的编译文件还在,PHP 直接 require 它,跳过了模板解析流程
手动清除 runtime/view/ 的正确姿势
最稳妥的方式是直接删掉整个 runtime/view/ 目录,而不是只删子目录或部分文件——因为 ThinkPHP 会按模板路径哈希分目录,人工判断哪些该删几乎不可能。
- 开发环境推荐命令:
rm -rf runtime/view/(Linux/macOS)或rd /s /q runtime\view(Windows CMD) - 别只删
runtime/view/*.php:通配符匹配不到深层哈希目录里的文件,漏删 = 白清 - 别用
php think clear --all:这个参数在 TP6 以前无效;TP6 起虽支持,但文档未明确是否包含view,实测不稳定 - 注意权限:如果 Web 服务器(如 nginx)和 CLI 用户不是同一个,删完可能因权限问题导致下次生成失败,建议统一用 Web 用户执行(如
sudo -u www-data php think clear)
开发阶段如何让模板缓存自动失效?
靠手动删太累,更靠谱的是关掉模板缓存,或者强制每次检查源文件修改时间。这不是性能优化项,而是开发调试必需项。
- 在
config/template.php中设'cache' => false,彻底禁用模板缓存(TP5.1+ 支持) - 或保留缓存但启用强制检测:
'strip_space' => false, 'tpl_begin' => '{', 'tpl_end' => '}', 'cache' => true, 'layout_on' => false, 'auto_layout' => false, 'taglib_begin' => '{', 'taglib_end' => '}', 'cache_time' => 0, 'layout_item' => '{__CONTENT__}'—— 关键是'cache_time' => 0,表示缓存永不过期,但 ThinkPHP 会对比源模板 mtime,有改动就重编译 - TP6 开始支持
'type' => 'File'下的'realpath' => true配置,能提升路径解析稳定性,避免因软链接或相对路径导致缓存误判
CI/CD 或线上部署时怎么安全清模板缓存?
不能依赖人工删目录,也不能直接关缓存——线上要性能。关键是把清除动作嵌入部署流程,并验证是否生效。
立即学习“PHP免费学习笔记(深入)”;
- 部署脚本末尾加一句:
php think clear:template(TP6.1+ 内置命令),这是唯一官方支持的模板缓存专项清理命令 - TP5.x 没这个命令,必须自己写个命令类,核心逻辑就是
File::delDir(runtime_path() . 'view'),然后注册为clear:template - 清完别忘了验证:访问一个刚改过的模板页,看响应头是否有
X-Tpl-Compiled: 1(可自定义埋点),或临时在模板里加{php}echo filemtime(THINK_PATH);{/php}看是否变化 - 注意并发风险:如果多个实例共享同一份
runtime/(比如负载均衡下没隔离),清除操作可能被其他请求打断,导致 500。此时应确保每个实例有独立runtime路径
模板缓存路径不透明、清除命令不精准、开发与生产缓存策略混用——这三个点最容易被忽略,一出问题就往“框架bug”上猜,其实翻两行源码就能定位到 think\template\driver\File::loadTemplate() 里那个 is_file($cacheFile) && filemtime($cacheFile) > filemtime($template) 判断。











