开发文档

鲜花交易系统与鲜花交易平台(PHP / ThinkPHP 版)的研发记录:功能上线、架构演进与实施经验,按发布日期持续更新。

静态化生成策略:什么时候生成、生成哪些、失败了怎么办

生成规则:把"生成什么"变成数据

静态化不给每种页面写死代码,而是用一张规则表描述:

目标类型含义默认 URL
1首页/index.html
2栏目页/{dir}/index.html
3文档页/{dir}/detail/{biz_no}.html
4单页按 page_key

每条规则可以限定到具体栏目(channel_biz_no),也可以留空表示全局。取规则的顺序是"栏目专属 > 全局 > 内置默认"——所以即使一条规则都没配,系统也能按内置约定生成,不至于"配错一处就全站不能发"。

落盘根与子目录

规则里的 output_path 不是绝对路径,只是默认输出目录下的子目录。默认输出目录来自「网站配置 → 静态化设置」(本项目是 public/html)。

这样设计的好处是:切换输出位置(比如从 /html 换到站点根)只需要改一处配置,规则不用动。代价是模板与链接里都要带这个前缀——所以我们把"URL 前缀"也收口到同一个配置读取点,避免两处算法不一致(这个坑我们在模板文章里讲过)。

模板取用顺序

生成一个页面时,模板按三级取:

  1. 目标自带的模板(文章可以单独指定模板);
  2. 所属栏目指定的模板(列表模板 / 内容模板);
  3. 按目标类型取默认模板。

三级都没有,则该目标记 template_empty 并跳过——跳过而不是报错:一个栏目还没配模板时,不应该让整批生成失败。

批量生成要分片

一个稍大的站点,栏目加文章可能上千个页面。一次性生成会超时,前端也看不到进度。

做法是按 50 个目标一片,前端循环调用并推进进度条。分片的关键是计数与分片同源:countChannelPages() 与 publishChannelPages() 必须用同一个查询条件,否则进度条会走到 120% 或者卡在 99%。

失败要能定位

生成结果分三类:写出、跳过、失败,每类都带目标标识与原因:

  • 跳过:模板为空、URL 规则算不出合法路径;
  • 失败:写文件失败(权限、磁盘)、模板语法异常。

我们坚持"单条失败不中断整批":一个页面模板写错,不应该让另外九百个页面停止生成。汇总里给出失败列表,运营或开发按目标逐个修。

什么时机生成

三种触发方式:

  • 手动:后台点"生成",最常用,客户改完内容自己刷;
  • 定时:配置 cron 定期全量生成,兜底那些忘记手动的场景;
  • 发布时:新增/修改文章后自动生成该栏目与文章页(体验最好,但要注意别让发布接口被生成拖慢,通常改成异步任务)。

一条自检建议

生成完成后做一次链接反查:抽取若干生成页里的内部链接,反推它在磁盘上对应的文件,验证是否存在。

这一步能抓住所有"路径算错"的问题——包括我们遇到过的子栏目文章链接少一层目录。生成静态站最容易出的不是样式问题,而是"页面生成了但没人能点到"。

本文属于「开发文档」系列,记录鲜花交易系统(PHP + ThinkPHP 8 + MySQL 8)的实际研发进展。想了解功能清单与报价,可前往系统报价或联系我们。