ThinkPHP 6.0 静态缓存本质是生成真实HTML文件而非缓存逻辑,需开启HTML_CACHE_ON、配置HTML_PATH可写、设置HTML_CACHE_RULES规则(如'news:index'=>['news_index_{id}',3600]),动态内容通过JS异步加载。

ThinkPHP 6.0 的静态缓存(HTML_CACHE)本质是把动态页面渲染结果生成真实 HTML 文件,**不是“缓存动态逻辑”,而是“缓存动态页的最终输出”**。所以它能缓存动态页,但前提是:该页面内容变化不频繁、可接受一定延迟,且需正确配置规则让框架知道“哪些 URL 对应生成哪个静态文件”。
核心配置项必须开启
确保项目配置中已启用静态缓存基础设置:
- 'HTML_CACHE_ON' => true —— 开启静态缓存功能
-
'HTML_PATH' => runtime_path('html') 或自定义路径(如
public/static_cache),需目录可写 -
'HTML_FILE_SUFFIX' => '.html'(可选,默认为
.html)
静态缓存规则怎么写(关键)
规则定义在 'HTML_CACHE_RULES' 数组中,格式为:'模块名(小写):操作名' => ['文件名规则', '缓存秒数', '附加处理函数']
常见写法示例:
立即学习“PHP免费学习笔记(深入)”;
-
缓存 News 控制器的 index 方法,按 ID 区分文件:
'news:index' => ['news_index_{id}', 3600]
访问/news/index/id/123→ 生成news_index_123.html -
缓存首页,固定文件名(适合无参数的首页):
'index:index' => ['index', 1800]
生成index.html,30 分钟内重复请求直接读该文件 -
用 GET 参数组合命名,避免冲突:
'search:index' => ['search_{q}_{page|intval}', 600]
请求/search/index?q=php&page=2→ 生成search_php_2.html -
全站统一规则(慎用):
'*' => ['{$_SERVER.REQUEST_URI|md5}', 600]
把完整 URL 做 MD5,生成唯一静态文件(注意 URI 中可能含敏感参数)
动态内容如何兼容静态缓存?
静态页无法执行 PHP,所以实时数据(如点击量、用户登录态、评论数)要靠前端异步加载:
- 在 HTML 模板中嵌入 JS 脚本,调用独立接口获取动态部分:
<div id="click-count"></div><br><script src="/api/click?id={$article.id}"></script> - 后端提供纯数据接口(如
Api/click),只返回 JS 可执行代码或 JSON,不走静态缓存 - 登录态等个性化内容,建议完全避开静态缓存,或使用 ESI、AJAX + localStorage 等混合方案
验证是否生效
开启后访问目标页面一次,检查:
- 配置的 HTML_PATH 目录下是否生成对应 .html 文件
- 再次刷新时,响应头中是否有 X-Powered-By: ThinkPHP —— 若没有,说明命中了静态文件;若有,说明仍走 PHP 渲染(规则未匹配或配置未生效)



















