迅睿CMS 缓存与性能:后台改了内容,前台为什么还是旧的
迅睿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 比查数据本身还慢。可选方案是缓存总数、或者只给「上一页/下一页」不给页码。
六、排查顺序
- 先清全部缓存,看是否恢复——恢复就是缓存问题,跳到第 4 步。
- 不清缓存直接看数据库,确认数据真的写进去了。
- 看静态文件是否生成、生成时间对不对。
- 定位是哪一层没失效:模板(改结构不生效)/数据(改内容不生效)/静态(新内容访问不到)。
- 补对应的清理逻辑,别只手动清一次。
手动清缓存只解决当下,下次发布还会复现。根因要落成代码里的清理触发。
七、上线前该做的事
- 模板缓存目录可写,且与源文件同机同时间基准
- 内容保存钩子里挂了清缓存
- 若开静态化,发布流程里有重生成步骤
- 列表页标签数量控制在三个以内
- 图片上传走缩略图,不直出原图
这五条做完,「改了不生效」这类工单基本能归零。
下一篇写数据调用与自定义字段:字段建了却取不出来,是怎么回事。