PHPCMS动态缓存是指将系统中频繁访问但非实时性要求的动态页面/数据片段,预先生成静态文件或存入内存缓存介质,下次请求时直接返回缓存结果的技术机制。合理配置可将站点单页响应时间从平均300-500ms降至20-80ms,并发承载能力提升5-20倍。
基础环境与工具准备
本文以PHPCMS V9.6.3 UTF-8正式版、Nginx 1.24.0、PHP 7.4.33、Redis 7.0.12为例,兼容主流LAMP/LNMP环境。
- 核心依赖:PHP需安装fileinfo扩展(用于内容片段缓存识别),若启用内存缓存需额外安装redis/redis扩展或memcached/memcache扩展
- 验证工具:Chrome DevTools(Network面板查看X-Cache响应头)、Redis Desktop Manager(查看内存缓存键值)
核心配置原理与底层机制
PHPCMS动态缓存采用两级缓存架构:一级为文件缓存(默认存储在/caches/caches_content/目录),二级为可选内存缓存(Redis/Memcached优先级高于文件缓存)。缓存键由应用标识、模块名、控制器名、方法名、GET/POST请求参数(可配置过滤规则)、用户组ID(可选,用于区分不同权限内容)组合生成,确保同一逻辑下不同参数/权限对应唯一缓存。
缓存失效触发分为三种:主动失效(内容发布/更新/删除时自动清除相关内容缓存)、被动失效(缓存到期后自动删除)、手动失效(后台手动清除全站/模块/单条内容缓存)。
全局基础配置与权限校验
后台全局配置
登录PHPCMS后台,进入设置 → 站点设置 → 基本设置。
- 开启动态页面缓存:将“是否开启动态页面缓存”设置为“是”
- 设置默认缓存时间:将“动态页面缓存时间(秒)”设为3600-86400(根据内容更新频率调整:资讯类3600,产品类86400)
- 设置缓存介质:进入设置 → 系统设置 → 缓存设置,选择“文件缓存”或“Redis缓存”,若选Redis需填写服务器IP、端口、密码、数据库编号
目录权限配置

Linux环境下需设置/caches/目录及其子目录的写权限,确保Nginx/Apache用户(如www-data、apache)可读写。
```bash
chmod -R 755 /path/to/phpcms/caches/
chown -R www-data:www-data /path/to/phpcms/caches/
```
验证缓存依赖扩展
新建phpinfo.php文件,上传至网站根目录,访问后搜索fileinfo、redis关键字,确认扩展状态为“enabled”。
分场景精细化配置(实战核心)
内容页动态缓存配置
内容页是PHPCMS访问量最大的页面,需重点配置权限区分与主动失效。
- 后台模块配置:进入内容 → 管理模型 → 对应模型(如文章模型),点击“修改”,在“生成HTML设置”中关闭“内容页生成HTML”(启用动态缓存无需生成静态页),在“权限设置”中开启“按用户组缓存内容页”(区分会员/游客权限内容)
- 模板文件标签配置:打开内容页模板文件(/phpcms/templates/default/content/show.html),在页面顶部添加{php $cache_enable = 1;}强制开启该页面缓存,添加{php $cache_time = 1800;}单独设置内容页缓存时间(可覆盖全局)
- 主动失效测试:发布一篇文章,记录缓存键(可通过后台“内容 → 内容管理 → 对应文章 → 查看缓存键”获取),使用Redis Desktop Manager查看键是否存在;更新文章内容后,再次查看键是否被删除
列表页/首页动态缓存配置
列表页/首页访问量仅次于内容页,需配置分页参数过滤与栏目级主动失效。
- 后台系统参数配置:进入设置 → 系统设置 → 缓存设置,在“动态缓存URL过滤参数”中添加“rand、timestamp、callback”(避免随机参数生成无效缓存),在“动态缓存更新时是否清除相关栏目”设置为“是”
- 栏目缓存单独配置:进入内容 → 管理栏目 → 对应栏目(如科技栏目),点击“修改”,在“动态缓存时间(秒)”中单独设置该栏目列表页缓存时间(可覆盖全局)
自定义模块动态缓存配置
自定义模块需手动调用PHPCMS缓存API实现缓存。
- 自定义模型动态缓存:在自定义模型控制器方法中添加以下代码:
```php
// 开启缓存
$cache_enable = 1;
// 单独设置缓存时间(秒)
$cache_time = 600;
// 缓存键前缀(可选,用于区分不同自定义模块)
$cache_prefix = 'custom_';
```
- 自定义标签缓存配置:在自定义标签类方法中添加以下代码:
```php
// 获取缓存
$cache = pc_base::load_sys_class('cache');
$key = md5('custom_tag_'.serialize($params));
$data = $cache->get($key);
if (!$data) {
// 生成数据逻辑
$data = $this->get_data($params);
// 写入缓存
$cache->set($key, $data, 600);
}
return $data;
```
常见问题排查与性能调优
常见问题排查
- 缓存不生效:检查后台是否开启动态缓存、目录权限是否正确、模板是否添加强制缓存标签、缓存键是否被过滤
- 缓存失效过快/过慢:检查全局/模块/页面缓存时间设置是否合理、主动失效触发机制是否正常
- 内存缓存键丢失:检查Redis内存是否不足(设置maxmemory-policy为allkeys-lru)、Redis连接是否正常
性能调优建议
- 启用内存缓存:内存缓存读取速度比文件缓存快100-1000倍,建议使用Redis
- 合理设置缓存时间:内容更新频繁的页面设置短缓存时间,内容更新缓慢的页面设置长缓存时间
- 优化URL过滤参数:避免不必要的参数生成无效缓存,减少缓存空间占用
- 定期清理过期缓存:后台提供“清除过期缓存”功能,建议每周清理一次