迅睿CMS 模板缓存:改了文件不生效怎么办

· 迅睿CMS · 阅读 14
摘要

迅睿CMS改模板不生效,比 WordPress 常见得多。原因是它有两层缓存,而且默认都开着。 第一层:模板编译缓存 模板里的标签语法最终会被编译成 PHP。编译产物放在 /cache/template/ 下(路径可在 config/te

迅睿CMS改模板不生效,比 WordPress 常见得多。原因是它有两层缓存,而且默认都开着。

第一层:模板编译缓存

模板里的标签语法最终会被编译成 PHP。编译产物放在 /cache/template/ 下(路径可在 config/template.php 里改)。

模板文件改了,编译缓存不一定立刻失效。有些版本会比对文件修改时间,有些版本只认手动更新。

后台「系统 → 更新缓存」能清掉这一层。也可以直接删 /cache/template/ 目录下的文件。

注意别删整个 /cache/。里面有数据库表结构缓存、路由缓存、字段缓存,全删了恢复起来要等几秒,访问量大的时候会打出一片 500。

第二层:数据缓存

这是更隐蔽的一层。模板标签本身的输出会被缓存。

典型场景:你在模板里加了一个 {module} 标签,发布一篇新文章,前台刷新看不见。但模板文件明明没写错。

这时候不是文件缓存的问题,是那个 {module} 标签的结果被缓存了。默认缓存时长通常是几百到几千秒。

两个解法:

  • 调试期间,在标签里加 cache="0" 关掉这个标签的缓存
  • 或者在后台把整体数据缓存关掉(调试完记得开回来)

我一般调试模板时先把整体缓存关了,改完再开。不然每次都要猜是文件变了没编译,还是数据被缓存了。

第三层:浏览器缓存

这一层最容易被忽略,因为界面已经改对了,但用户看到的还是旧样式。

迅睿CMS静态资源(CSS、JS)的 URL 上一般不带版本参数,除非模板里自己写了。

样式改了不生效,先在地址后面加 ?v=1 试试。如果加了就生效,说明是浏览器缓存。

根治办法是在模板里给静态资源带上版本号:

<link rel="stylesheet" href="{\$site.css}/style.css?v={$version}">

$version 从站点配置或者一个自增号里取。这样每次发版换一个值,浏览器自动重新拉。

四层:CDN

如果站挂了 CDN,上面三层都对了还可能看不到。

CDN 默认缓存 HTML 页面的话,改什么东西都要等 CDN 刷。

排查顺序应该是(从近到远):浏览器缓存 → CDN 缓存 → 应用层数据缓存 → 模板编译缓存。

从近到远查,能最快排掉一大半。反过来从远往近查,往往查到最后一层才发现是浏览器缓存。

一个实用的调试技巧

改模板时,先在模板最顶上随便写一行带时间的注释:

<!-- tpl: home/index @ 2026-01-20 15:30 -->

页面源码里看到这行,说明模板编译过了、缓存也刷了。看不到,问题一定在上面四层里。

这一招我用了很多年,比开浏览器开发者工具看网络请求快。

生产环境的一条底线

不管调试怎么折腾,上线前确认一件事:模板编译缓存开着。

关掉编译缓存时,迅睿每次请求都要编译一遍模板,QPS 会掉一个数量级。我带过的一个站,有人图省事一直没开,首页 TTFB 从 80ms 涨到 600ms,查了很久才发现。