织梦静态页面缓存和程序缓存区别

很多新手把织梦的"静态页面缓存"和"程序缓存"混为一谈,操作时常常清错对象,结果改了模板还不生效。其实这两层缓存存放位置、生成机制、生命周期完全不同,理解它们的差异才能精准解决问题。本文从本质、配置、对比三个维度展开。

一、本质区别:一个写 HTML,一个写序列化数据

1. 静态页面缓存

静态页面缓存指的是织梦"生成 HTML"功能产出的 .html 文件,存放在 /a/(默认栏目页/内容页目录)或自定义的静态目录下。用户访问前台时 Nginx/Apache 直接返回这个文件,PHP 与数据库完全不参与。这是织梦性能优于很多动态 CMS 的根本原因。

2. 程序缓存

程序缓存是织梦在 PHP 运行时把栏目配置、模型字段、TAG 列表、系统参数等高频读取的数据序列化后写到 /data/cache/ 下的 .inc.php.txt 文件里。下次需要这些数据时直接 includefile_get_contents,避免反复查库。它只在动态请求或后台操作时生效,前台静态页面看不到它的工作。

二、详细对比表

对比项静态页面缓存程序缓存
存储位置/a/、/news/ 等栏目目录/data/cache/、/data/static/
文件类型.html 纯静态.inc/.php/.txt 序列化
是否连数据库是(首次生成时)
触发更新后台"生成"或发布文章后台"清除缓存"或写入操作
用户访问Web 服务器直接返回PHP 运行时读取
体积大(几 KB~数百 KB/页)小(几 KB~几十 KB/项)
典型场景前台所有页面后台、动态页、tag、search

三、配置示例

1. 静态页面缓存配置

后台 → 系统 → 系统基本参数 → 性能选项:

是否使用静态页面:是
静态页面保存目录:/a
栏目页命名规则:{typedir}/index.html
文章页命名规则:{typedir}/{aid}.html
列表页命名规则:{typedir}/list_{tid}_{page}.html

2. 程序缓存配置

// data/config.cache.inc.php
$cfg_cache_time=3600;  // 程序缓存有效期(秒)
$cfg_memcache_enable='N';  // 是否启用 memcache

// 涉及代码位置 include/common.func.php
function GetCache($prefix, $key) { ... }
function SetCache($prefix, $key, $value, $timeout=3600) { ... }

程序缓存的核心函数是 GetCache/SetCache,织梦内核、plus 插件、自定义二开都会调用。

四、生命周期对比

静态页面缓存

1. 用户访问 example.com/news/1.html
2. Nginx 直接返回 /a/news/1.html,不经过 index.php
3. 站长在后台发布新文章 → 触发该栏目重新生成
4. 旧 HTML 被覆盖,新内容生效

程序缓存

1. 用户访问 example.com/plus/search.php(动态页)
2. PHP 调用 GetCache('search', $kw) 查找缓存
3. 命中:直接返回;未命中:查库后 SetCache 写入
4. 缓存到期或后台清除后失效

五、典型问题与排查

症状 A:前台文章内容没更新,但后台显示已发布。
原因:静态页面缓存未重新生成。解决:后台"生成—更新文档 HTML"。

症状 B:动态搜索页、tag 页数据滞后,但静态页正常。
原因:程序缓存未失效。解决:后台"系统—清除系统缓存",或删除 /data/cache/

症状 C:改了系统参数没生效。
原因:程序缓存里的 config.cache.inc.php 等配置缓存未刷新。解决:后台"系统基本参数"页面底部点击"确定"会自动重建,或手工删除 /data/config.cache.inc.php

六、注意事项

不要混淆清除动作:"清除系统缓存"只清程序缓存,不会动静态 HTML;"一键更新网站"只重新生成静态页,不会清程序缓存。两者必须配合使用。

动态页占主导的站点慎用静态:会员中心、电商、强交互站点如果开了静态生成会导致内容不同步,建议这类页面用动态+程序缓存即可。

七、实践建议

理解了静态缓存与程序缓存的本质差异后,建议在站点维护流程中固定两条动作:每次内容更新执行"生成静态页 + 清程序缓存",每次模板修改执行"重新生成 + CDN 刷新"。把这两条固化进运维 SOP,可以彻底告别"改了不生效"的反复困扰,让织梦站点的更新可预期、可验证。