ThinkPHP 模板引擎编译缓存如何清理避免页面显示旧数据?
核心结论:ThinkPHP 模板缓存不更新的主因是 template.cache_expire 默认值为 60 秒,开发阶段必须设为 0 才能实时生效。
原因分析
ThinkPHP 模板缓存机制分为两层:Runtime/Cache 下的 PHP 编译文件和 Runtime/Temp 里的模板哈希映射表 (template_*.php)。只清 Cache 目录而保留 Temp 目录时,框架会认为模板未变化,继续执行已损坏的缓存文件。模板缓存是否重新编译取决于两个条件:源模板文件修改时间是否晚于缓存文件,以及 template.cache_expire 是否为 0 或负数。只要这个值大于 0(默认 60),即使模板改了,缓存也会强制沿用 60 秒。
解决方案
方案一:修改配置文件禁用缓存(开发环境推荐)
在 config/app.php 中设置 'html_cache_on' => false,在 config/template.php 中设置 'template.cache_expire' => 0(注意是数字 0,不是字符串'0')。若只在开发环境禁用,可用条件判断:'html_cache_on' => app()->isDebug()。此方法适用于 ThinkPHP 5.1+ 及 6+ 版本。
方案二:手动清理缓存目录
必须同时删除 Runtime/Cache 和 Runtime/Temp 两个目录。ThinkPHP 6+ 的缓存文件默认存于 runtime/cache/(单应用)或 runtime/应用名/cache/(多应用)。清理时仅删除 cache/ 子目录,避免误删 log/、temp/ 等关键目录。命令行操作可在项目根目录执行:php think clear 或 php think cache:clear –type=file。
方案三:代码方式清除缓存
在控制器中添加以下代码:\think\facade\Cache::clear('temp') 清除编译缓存,\think\facade\Cache::clear('cache') 清除数据缓存。若使用缓存标签,可按标签清除:\think\facade\Cache::tag('user_data')->clear()。ThinkPHP 5.0 可创建 cache 控制器,调用 Cache::clear() 方法。
方案四:处理 HTML 静态缓存
很多人改了模板文件页面却没变,实际是 HTML 静态缓存拦截请求。检查方法:直接访问带参数的 URL(如/index/index?x=1),如果这次变了而/index/index 不变,基本就是 html 缓存生效。需同时清理 runtime/html/目录,该路径默认不随 php think clear 命令清理。
注意事项
1. 不要直接删除整个 runtime/目录,该目录包含日志文件、模板编译缓存、路由缓存等,误删会导致应用启动报错或抛出模板找不到异常。
2. 模型查询缓存与模板缓存是两回事,Cache::clear() 对模型查询缓存无效,因其缓存键仅含类名、方法名和 SQL 模板,不包含条件值且未打标。需改用 Db::name('user')->where()->cache('user_list_status_1', 3600)->select() 显式传入带业务语义的缓存键。
3. Linux 下要注意文件系统时间精度(如 ext4 默认 1 秒),快速连续保存可能被判定为未更新,可加 touch 命令强制刷新时间戳。
4. PHP 的 opcache 会缓存已编译的 PHP 文件(包括 ThinkPHP 生成的 runtime/view/*.php),Nginx/Apache 也可能返回 304 或本地强缓存,此时清 runtime/目录无效,需重启 PHP-FPM 或清除 opcache。
5. 字段结构缓存存在 runtime/schema/或 runtime/temp/下,删完要再跑一次\think\facade\Db::clearCache() 才真正刷新。
参考来源
来源:ThinkPHP 官方技术文档 - 模板引擎编译缓存机制说明(2026 年 4 月 9 日发布)
来源:ThinkPHP 开发者社区 - 模板缓存不刷新问题汇总(2026 年 3 月 24 日发布)
来源:GitHub ThinkPHP Issues - 缓存清理命令优化讨论(2026 年 4 月 16 日收录)
来源:CSDN 技术博客 - ThinkPHP5.0 清除缓存、模版缓存和日志缓存的方法(截至 2023 年 7 月 16 日)
原文链接:https://www.zjcp.cc/ask/9572.html
