迅睿CMS 缓存与性能:后台改了内容,前台为什么还是旧的

· 迅睿CMS · 阅读 15
摘要

迅睿CMS后台改了内容、前台却还是旧数据,绝大多数不是没保存成功,而是三层缓存里有一层没有失效:模板编译缓存、数据查询缓存、页面静态化。这篇拆清三层各自管什么、什么时候会失效、分别该怎么清,以及为什么清完还要看后台的缓存开关和栏目自身的静态化设置。

「我明明改了,刷新还是老的」——这是迅睿CMS 后台最高频的疑问之一。绝大多数不是 bug,是三层缓存里有一层没清。

一、三层缓存分别管什么

层级存什么失效时机
模板编译缓存标签语法转成的 PHP 文件改模板文件后
数据查询缓存列表、栏目、配置的查询结果发/改/删内容后
页面静态化生成的 .html 实体文件手动或定时

改模板不动,是第三层没清;改内容不动,是第二层没清;两者都改了还不动,多半是开了静态化,实体文件压根没重生成。

二、模板缓存在哪

编译后的 PHP 一般落在缓存目录里,文件名是模板路径的哈希。改模板源文件后,系统靠比对修改时间决定是否重编译——如果服务器时间和文件时间有偏差,比对会失效,就一直用旧编译文件。

手动清:后台「系统 → 缓存更新」勾模板缓存,提交。

代码里清:

\dr_clear_cache();

这个函数同时清模板和数据缓存,后台改完内容调用一次最稳。

三、数据缓存的作用域

数据缓存不是全局一把清。列表查询按「参数组合」做 key,参数不同就是不同缓存。所以会出现:首页列表更新了,栏目页列表还是旧的——因为两个页面的 pagesize、order 不同,key 不同。

这时候只清首页没用,要么全清,要么发内容时触发关联清理。后者需要在内容保存的钩子里补一句清缓存,否则就只能等超时。

四、静态化是双刃剑

开了静态化,访问不走 PHP,直接读 .html 文件,快是真快。但:

  • 发文章必须重新生成,否则新文章访问不到。
  • 改了模板,所有已生成的页面还是旧结构,得批量重生成。
  • 评论区如果是动态的,静态页上的评论不会更新。

建议:内容量小、更新频繁的站别开;内容量大、更新少的站开着划算,但要把「发布即生成」配好。

五、几个真实的性能瓶颈

1. 列表页标签数量

每多一个 {module} 标签就是一次查询。首页挂六个区块,就是六次查询,且都不走缓存时是实打实的六次 SQL。

2. more=1 的代价

连附表取字段,查询从单表变关联。列表 10 条还行,50 条就明显。列表页尽量只取主表字段,详情信息留给详情页。

3. 图片没压缩

上传原图直出,单页几 MB,性能问题一半出在这。上传时就该生成缩略图并按需返回。

4. 分页算总数

分页要 COUNT(*) 才能算总页数。百万级表上这个 count 比查数据本身还慢。可选方案是缓存总数、或者只给「上一页/下一页」不给页码。

六、排查顺序

  1. 先清全部缓存,看是否恢复——恢复就是缓存问题,跳到第 4 步。
  2. 不清缓存直接看数据库,确认数据真的写进去了。
  3. 看静态文件是否生成、生成时间对不对。
  4. 定位是哪一层没失效:模板(改结构不生效)/数据(改内容不生效)/静态(新内容访问不到)。
  5. 补对应的清理逻辑,别只手动清一次。

手动清缓存只解决当下,下次发布还会复现。根因要落成代码里的清理触发。

七、上线前该做的事

  • 模板缓存目录可写,且与源文件同机同时间基准
  • 内容保存钩子里挂了清缓存
  • 若开静态化,发布流程里有重生成步骤
  • 列表页标签数量控制在三个以内
  • 图片上传走缩略图,不直出原图

这五条做完,「改了不生效」这类工单基本能归零。

下一篇写数据调用与自定义字段:字段建了却取不出来,是怎么回事。