改完模板不生效:模板缓存、CDN 和浏览器缓存到底卡在哪

· zblog · 阅读 18
摘要

改一行 CSS,刷新,没变。再刷,还没变。这时候先别怀疑代码。 三层缓存,从后往前查。 第一层,浏览器。强刷是 Ctrl+F5,Mac 上 Cmd+Shift+R。不确定的话,直接开无痕窗口最省事。 第二层,CDN 或反向代理。站上要

改一行 CSS,刷新,没变。再刷,还没变。这时候先别怀疑代码。

三层缓存,从后往前查。

第一层,浏览器。强刷是 Ctrl+F5,Mac 上 Cmd+Shift+R。不确定的话,直接开无痕窗口最省事。

第二层,CDN 或反向代理。站上要是挂了 Cloudflare 之类,它缓存的可能是旧 CSS。看响应头里有没有 cf-cache-status: HIT,有就是它。清缓存或者加时间戳参数验证。

第三层,Z-Blog 自己的模板编译缓存。这层最容易被忽略。

模板缓存是怎么回事。

Z-Blog 不是每次请求都解析 {if} {$var} 这些标签。第一次访问时,它把模板文件编译成纯 PHP,存到 zb_users/cache/ 下。之后读的是编译产物。

所以改了 .php 模板文件,前台可能毫无反应,因为跑的还是旧的编译结果。

后台「清空缓存并重新编译模板」就是干这个的。

有个更隐蔽的情况:改了 include.php 里的 PHP 逻辑,也不生效。这个不走模板缓存,但如果开了 opcache,PHP 层还会缓存一份。重启 php-fpm 或者等 opcache 过期。

怎么确认到底是哪层。

加一行肉眼能看见的东西,比如在模板里写个 <!-- v20261020 -->。刷新看源码里有没有。

有,说明模板更新了,问题在 CSS/JS 层面(第二层)。没有,说明模板没重新编译(第三层)。

这一步能省掉大量瞎猜。

开发时的省事做法。

静态资源加版本号。style.css?v=1.2.3,改一次升一次,浏览器自然就拿新文件了。手动改版本号麻烦,可以在主题配置里存个时间戳,模板里拼上去。

更省事的写法是拼文件修改时间:?v=<?php echo filemtime($cssFile); ?>。文件一动,参数就变。

但线上别这么写,filemtime 每次请求都要 stat 一次磁盘,量大了是负担。开发用,上线换成固定版本号。

还有个反向的坑。

改了却没生效让人烦,但更烦的是——明明没改,它自己变了。

这种情况通常是清理了缓存,导致编译产物重建,正好把你之前手动改过、但没存回模板文件的东西冲掉了。所以任何在 zb_users/cache/ 里的手改,都不算数。

你改主题时,是先清缓存还是先强刷浏览器?