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

phpcms自定义模板如何静态化
(图片来源网络,侵删)

下面我将分步详细解释这两种方法,以及相关的配置和高级技巧。


静态化的核心概念

在开始之前,我们先理解几个关键概念:

  1. 动态页面由服务器实时从数据库中查询并生成,每次访问都会执行数据库查询和PHP脚本解析。index.php?m=content&c=index&a=lists&catid=1
  2. 静态页面是预先生成好的HTML文件,直接存在于服务器上,用户访问时,Web服务器(如Nginx、Apache)直接将这个HTML文件发送给浏览器,无需PHP和数据库参与。html/index/1.html
  3. 伪静态:通过URL重写技术,将动态的URL地址伪装成静态的URL形式,但实际上页面仍然是动态生成的,将 index.php?m=content&c=index&a=lists&catid=1 显示为 category/1.html,这能提升用户体验和URL友好度,但对服务器性能没有本质提升。
  4. 自定义模板:指你根据PHPCMS的模板规范,编写的 .html 文件,用于控制网站的最终展示样式。

我们的目标是:让访问自定义模板的动态页面,能够自动或手动地生成一个对应的静态HTML文件。


手动生成静态页面

这是最直接、最基础的方法,适用于内容更新不频繁的页面,如首页、单页文章、栏目页等。

phpcms自定义模板如何静态化
(图片来源网络,侵删)

步骤 1:确保模型支持静态化

只有在你后台创建的“模型”中开启了静态化选项,相关页面才能生成静态文件。

  1. 登录 PHPCMS 后台。
  2. 进入 内容 -> 内容模型管理
  3. 找到你想要生成静态页面的模型(文章模型”),点击 修改
  4. 在模型设置中,找到 “生成HTML” 或类似选项,确保它被 勾选
  5. 保存设置。

步骤 2:在内容管理中生成

对于单篇文章或栏目列表,可以在发布或编辑时直接生成。

  1. 生成单篇文章

    • 进入 内容 -> 内容管理,选择你的模型(如“文章”)。
    • 编辑一篇你想要静态化的文章。
    • 在编辑页面的底部,找到 “生成选项”
    • 你可以选择 页”“生成栏目页”“生成首页” 等。
    • 勾选你需要的选项,然后点击 “发布”“更新”
  2. 生成栏目页

    • 进入 内容 -> 栏目管理
    • 编辑你想要生成静态页面的栏目。
    • 在栏目设置中,找到 “生成选项”
    • 勾选 “生成栏目页”,并可以设置是否生成下级栏目页等。
    • 保存设置。

步骤 3:使用后台“一键生成”功能

对于整个网站或大量页面,可以使用后台的批量生成功能。

  1. 进入 内容 -> 一键生成
  2. 你可以看到几个选项:
    • 生成首页:点击即可生成网站的首页静态文件。
    • 生成栏目:选择需要生成静态页面的栏目,然后点击生成,可以生成当前栏目及其下级栏目。
    • :可以按栏目、按时间范围批量生成所有文章的内容页。
    • 更新HTML:用于更新已有的静态文件。
  3. 选择好范围后,点击生成按钮即可,这个过程可能会比较耗时,具体取决于你的内容数量。

定时自动生成静态页面

这是最高效、最常用的方法,尤其适用于内容更新频繁的网站,它能让用户在访问页面时,如果对应的静态文件不存在或已过期,系统会自动生成它。

步骤 1:开启“自动生成”开关

  1. 登录 PHPCMS 后台。
  2. 进入 系统 -> 系统基本参数 -> 性能选项
  3. 找到 页是否自动生成静态”,将其设置为 “是”
  4. 保存设置。

工作原理: 开启此选项后,当用户访问一个动态URL(如 index.php?m=content&c=index&a=show&catid=1&id=123)时,PHPCMS 的底层逻辑会这样工作:

  1. 系统检查 html/ 目录下是否存在对应的静态文件(如 html/1/123.html)。
  2. 如果文件存在且未过期(过期时间由下面的缓存时间控制),直接将该HTML文件发送给用户,速度极快。
  3. 如果文件不存在或已过期,系统会先动态生成这个HTML文件,并将其保存到 html/ 目录下,然后再将内容发送给用户。
  4. 对于后续的访问,因为文件已经存在,就会直接读取静态文件。

步骤 2:设置缓存时间

  1. 同样在 系统 -> 系统基本参数 -> 性能选项 中。
  2. 找到 页静态文件缓存时间”
  3. 设置一个合理的时间,3600(单位:秒,即1小时),这意味着系统会认为1小时内生成的静态文件是有效的,过期后才需要重新生成。
  4. 保存设置。

这个时间设置非常重要

  • 时间过短(如60秒):会导致频繁生成静态文件,增加服务器负载,失去了静态化的意义。
  • 时间过长(如86400秒/1天)更新频繁,用户在很长时间内看到的都是旧内容。

步骤 3:配置定时任务(可选但推荐)

虽然“自动生成”已经能解决大部分问题,但对于首页和栏目页这类高流量入口,我们更希望它们在内容更新后能被立即更新,而不是等到用户访问时才更新。

这时,我们可以利用Linux的 crontab 定时任务来定期触发PHPCMS的生成脚本。

  1. 找到PHPCMS的生成脚本: 这个脚本通常位于你的网站根目录下,名为 createhtml.php

  2. 编写执行命令: 你可以通过 curlwget 命令来访问这个脚本,从而触发生成过程。 每小时执行一次生成首页和指定栏目的命令:

    * */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 参数表示更新缓存。
  3. 设置Crontab

    • 登录你的Linux服务器。
    • 输入 crontab -e 命令来编辑定时任务列表。
    • 将上面的命令添加到文件中,保存并退出。
    • 使用 service crond restart 命令重启crond服务使配置生效。

自定义模板中的注意事项

你的自定义模板代码本身也需要符合PHPCMS的规范,才能被正确静态化。

  1. 使用官方标签: 确保你的模板文件(如 show.html, list.html)中使用的是 PHPCMS 的标准模板标签,如 {$title}, {date('Y-m-d', $inputtime)}, {loop $data $r}...{/loop} 等,不要使用原生PHP代码,因为静态化过程是PHP执行的,而最终生成的HTML文件里不能包含PHP代码。

  2. 路径问题

    • 在静态化页面中,所有相对路径(如 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>
  3. 分页处理: 如果你的列表页或内容页有分页,静态化处理需要特别注意。

    • 手动生成:在“一键生成”时,需要勾选“生成分页”选项。
    • 自动生成:开启“内容页自动生成静态”后,分页链接通常会被正确处理为静态链接,第二页会是 html/1/123_2.html,你需要确保模板中的分页标签(如 {pages})输出的是正确的静态URL格式。

常见问题与排查

  1. 生成了空白页面或内容不完整

    • 原因:通常是PHP执行超时、文件权限不足或模板中使用了不兼容的标签/函数。
    • 排查:检查 php.ini 中的 max_execution_timememory_limit 设置;确保 html/ 目录有写入权限(权限通常设置为 755777777 有安全风险,建议 755);检查模板语法是否正确。
  2. 静态文件生成失败,提示“目录不存在”

    • 原因:PHPCMS 默认在网站根目录下创建 html 文件夹来存放静态文件,如果该文件夹不存在或无权限,就会失败。
    • 排查:请手动在网站根目录下创建一个名为 html 的文件夹,并赋予正确的读写权限。
  3. 访问动态URL,但看不到静态效果

    • 原因:没有开启“内容页自动生成静态”功能。
    • 排查:请按照 第三部分 的步骤,在后台 系统 -> 系统基本参数 -> 性能选项 中开启该功能。
需求 推荐方法 操作位置
一次性更新所有页面 手动生成 后台 内容 -> 一键生成
发布重要文章后立即更新首页 定时任务 服务器 crontab 定时访问 createhtml.php
页都静态化 自动生成 后台 系统 -> 系统基本参数 -> 性能选项 中开启
确保模型支持静态化 模型设置 后台 内容 -> 内容模型管理

对于绝大多数网站,最佳实践是:页自动生成静态”,并配合一个每小时执行一次的定时任务**来更新首页和重要栏目,这样既能保证内容页的快速响应,又能让首页等重要页面及时更新。