PHPCMS(特指其 V9 版本,目前最常用)的静态化功能非常强大,是提升网站性能和SEO效果的关键手段,它主要分为两种模式:手动生成 和 定时自动生成。

下面我将分步详细解释这两种方法,以及相关的配置和高级技巧。
静态化的核心概念
在开始之前,我们先理解几个关键概念:
- 动态页面由服务器实时从数据库中查询并生成,每次访问都会执行数据库查询和PHP脚本解析。
index.php?m=content&c=index&a=lists&catid=1 - 静态页面是预先生成好的HTML文件,直接存在于服务器上,用户访问时,Web服务器(如Nginx、Apache)直接将这个HTML文件发送给浏览器,无需PHP和数据库参与。
html/index/1.html - 伪静态:通过URL重写技术,将动态的URL地址伪装成静态的URL形式,但实际上页面仍然是动态生成的,将
index.php?m=content&c=index&a=lists&catid=1显示为category/1.html,这能提升用户体验和URL友好度,但对服务器性能没有本质提升。 - 自定义模板:指你根据PHPCMS的模板规范,编写的
.html文件,用于控制网站的最终展示样式。
我们的目标是:让访问自定义模板的动态页面,能够自动或手动地生成一个对应的静态HTML文件。
手动生成静态页面
这是最直接、最基础的方法,适用于内容更新不频繁的页面,如首页、单页文章、栏目页等。

步骤 1:确保模型支持静态化
只有在你后台创建的“模型”中开启了静态化选项,相关页面才能生成静态文件。
- 登录 PHPCMS 后台。
- 进入 内容 -> 内容模型管理。
- 找到你想要生成静态页面的模型(文章模型”),点击 修改。
- 在模型设置中,找到 “生成HTML” 或类似选项,确保它被 勾选。
- 保存设置。
步骤 2:在内容管理中生成
对于单篇文章或栏目列表,可以在发布或编辑时直接生成。
-
生成单篇文章:
- 进入 内容 -> 内容管理,选择你的模型(如“文章”)。
- 编辑一篇你想要静态化的文章。
- 在编辑页面的底部,找到 “生成选项”。
- 你可以选择 页”、“生成栏目页”、“生成首页” 等。
- 勾选你需要的选项,然后点击 “发布” 或 “更新”。
-
生成栏目页:
- 进入 内容 -> 栏目管理。
- 编辑你想要生成静态页面的栏目。
- 在栏目设置中,找到 “生成选项”。
- 勾选 “生成栏目页”,并可以设置是否生成下级栏目页等。
- 保存设置。
步骤 3:使用后台“一键生成”功能
对于整个网站或大量页面,可以使用后台的批量生成功能。
- 进入 内容 -> 一键生成。
- 你可以看到几个选项:
- 生成首页:点击即可生成网站的首页静态文件。
- 生成栏目:选择需要生成静态页面的栏目,然后点击生成,可以生成当前栏目及其下级栏目。
- :可以按栏目、按时间范围批量生成所有文章的内容页。
- 更新HTML:用于更新已有的静态文件。
- 选择好范围后,点击生成按钮即可,这个过程可能会比较耗时,具体取决于你的内容数量。
定时自动生成静态页面
这是最高效、最常用的方法,尤其适用于内容更新频繁的网站,它能让用户在访问页面时,如果对应的静态文件不存在或已过期,系统会自动生成它。
步骤 1:开启“自动生成”开关
- 登录 PHPCMS 后台。
- 进入 系统 -> 系统基本参数 -> 性能选项。
- 找到 页是否自动生成静态”,将其设置为 “是”。
- 保存设置。
工作原理:
开启此选项后,当用户访问一个动态URL(如 index.php?m=content&c=index&a=show&catid=1&id=123)时,PHPCMS 的底层逻辑会这样工作:
- 系统检查
html/目录下是否存在对应的静态文件(如html/1/123.html)。 - 如果文件存在且未过期(过期时间由下面的缓存时间控制),直接将该HTML文件发送给用户,速度极快。
- 如果文件不存在或已过期,系统会先动态生成这个HTML文件,并将其保存到
html/目录下,然后再将内容发送给用户。 - 对于后续的访问,因为文件已经存在,就会直接读取静态文件。
步骤 2:设置缓存时间
- 同样在 系统 -> 系统基本参数 -> 性能选项 中。
- 找到 页静态文件缓存时间”。
- 设置一个合理的时间,
3600(单位:秒,即1小时),这意味着系统会认为1小时内生成的静态文件是有效的,过期后才需要重新生成。 - 保存设置。
这个时间设置非常重要:
- 时间过短(如60秒):会导致频繁生成静态文件,增加服务器负载,失去了静态化的意义。
- 时间过长(如86400秒/1天)更新频繁,用户在很长时间内看到的都是旧内容。
步骤 3:配置定时任务(可选但推荐)
虽然“自动生成”已经能解决大部分问题,但对于首页和栏目页这类高流量入口,我们更希望它们在内容更新后能被立即更新,而不是等到用户访问时才更新。
这时,我们可以利用Linux的 crontab 定时任务来定期触发PHPCMS的生成脚本。
-
找到PHPCMS的生成脚本: 这个脚本通常位于你的网站根目录下,名为
createhtml.php。 -
编写执行命令: 你可以通过
curl或wget命令来访问这个脚本,从而触发生成过程。 每小时执行一次生成首页和指定栏目的命令:* */1 * * * /usr/bin/wget -q -O /dev/null http://www.yourdomain.com/createhtml.php?upcache=1
* */1 * * *:表示每小时执行一次。/usr/bin/wget:使用wget工具(请确保服务器已安装)。-q -O /dev/null:静默执行,并将输出重定向到/dev/null,避免产生邮件。http://www.yourdomain.com/createhtml.php?upcache=1:这是PHPCMS生成脚本的URL,?upcache=1参数表示更新缓存。
-
设置Crontab:
- 登录你的Linux服务器。
- 输入
crontab -e命令来编辑定时任务列表。 - 将上面的命令添加到文件中,保存并退出。
- 使用
service crond restart命令重启crond服务使配置生效。
自定义模板中的注意事项
你的自定义模板代码本身也需要符合PHPCMS的规范,才能被正确静态化。
-
使用官方标签: 确保你的模板文件(如
show.html,list.html)中使用的是 PHPCMS 的标准模板标签,如{$title},{date('Y-m-d', $inputtime)},{loop $data $r}...{/loop}等,不要使用原生PHP代码,因为静态化过程是PHP执行的,而最终生成的HTML文件里不能包含PHP代码。 -
路径问题:
- 在静态化页面中,所有相对路径(如 CSS, JS, 图片链接)都是相对于静态HTML文件本身的,而不是相对于动态脚本。
- 你的静态文件在
html/news/123.html,那么CSS路径写成../statics/css/style.css是正确的,如果写成/statics/css/style.css也是正确的(绝对路径)。 - 最佳实践:在模板中使用
{CSS_PATH}和{JS_PATH}这两个全局变量,它们会自动指向你的statics目录。<link href="{CSS_PATH}style.css" rel="stylesheet"> <script src="{JS_PATH}jquery.min.js"></script>
-
分页处理: 如果你的列表页或内容页有分页,静态化处理需要特别注意。
- 手动生成:在“一键生成”时,需要勾选“生成分页”选项。
- 自动生成:开启“内容页自动生成静态”后,分页链接通常会被正确处理为静态链接,第二页会是
html/1/123_2.html,你需要确保模板中的分页标签(如{pages})输出的是正确的静态URL格式。
常见问题与排查
-
生成了空白页面或内容不完整:
- 原因:通常是PHP执行超时、文件权限不足或模板中使用了不兼容的标签/函数。
- 排查:检查
php.ini中的max_execution_time和memory_limit设置;确保html/目录有写入权限(权限通常设置为755或777,777有安全风险,建议755);检查模板语法是否正确。
-
静态文件生成失败,提示“目录不存在”:
- 原因:PHPCMS 默认在网站根目录下创建
html文件夹来存放静态文件,如果该文件夹不存在或无权限,就会失败。 - 排查:请手动在网站根目录下创建一个名为
html的文件夹,并赋予正确的读写权限。
- 原因:PHPCMS 默认在网站根目录下创建
-
访问动态URL,但看不到静态效果:
- 原因:没有开启“内容页自动生成静态”功能。
- 排查:请按照 第三部分 的步骤,在后台 系统 -> 系统基本参数 -> 性能选项 中开启该功能。
| 需求 | 推荐方法 | 操作位置 |
|---|---|---|
| 一次性更新所有页面 | 手动生成 | 后台 内容 -> 一键生成 |
| 发布重要文章后立即更新首页 | 定时任务 | 服务器 crontab 定时访问 createhtml.php |
| 页都静态化 | 自动生成 | 后台 系统 -> 系统基本参数 -> 性能选项 中开启 |
| 确保模型支持静态化 | 模型设置 | 后台 内容 -> 内容模型管理 |
对于绝大多数网站,最佳实践是:页自动生成静态”,并配合一个每小时执行一次的定时任务**来更新首页和重要栏目,这样既能保证内容页的快速响应,又能让首页等重要页面及时更新。
