thinkphp 6.0 不内置 html 静态缓存功能,所谓“静态缓存”实为模板编译缓存和页面级缓存输出两类;需通过 cache 手动实现 html 字符串缓存或写入真实 .html 文件,并配合 nginx try_files 规则直接服务,或使用 redis + etag/last-modified 实现无文件 http 缓存。

ThinkPHP 6.0 本身不内置“HTML静态缓存”(即自动生成 .html 文件并直接由 Web 服务器响应的全站静态化功能),它没有像 PHPCMS 或 ThinkPHP5.1 那样提供 'HTML_CACHE_ON' => true 这类配置项。所谓“静态缓存”在 TP6 中实际指两类:一是模板编译缓存(避免重复解析 Twig/ThinkTemplate),二是页面级缓存输出(将整个响应内容缓存为文件,再通过中间件或 Nginx 规则复用)。真正能显著提升首屏速度和降低 PHP 负载的,是后者——但需手动组合实现。
启用模板编译缓存(基础提速)
这是默认开启且必须保障有效的环节:
- 确保
config/template.php中'cache' => true且'cache_path'指向可写的runtime/template/目录 - 检查
runtime/template/下是否生成了类似xxx.php的编译后文件;若每次访问都重建,说明目录权限错误(Web 进程用户如www-data必须拥有写权限) - 生产环境建议关闭
'strip_space'和'debug',避免运行时额外处理
实现页面级静态缓存(关键提速)
TP6 不自动写 .html 文件,但可通过 Cache + 自定义逻辑达成近似效果:
- 在控制器中调用
Cache::get('page_cache_' . $key)尝试读取已缓存的 HTML 字符串;未命中则执行$content = $this->fetch()渲染,并用Cache::set('page_cache_' . $key, $content, 3600)存储 - 缓存键建议包含 URL 参数哈希(如
md5($request->url(true))),避免 GET 参数不同导致缓存污染 - 若使用文件缓存驱动,确认
config/cache.php中'file' => ['path' => runtime_path('html_cache')]单独指定目录,避免与运行时缓存混用
配合 Web 服务器直接服务静态文件(终极加速)
仅靠 PHP 层缓存仍需启动框架。更高效的做法是让 Nginx/Apache 绕过 PHP,直接返回缓存文件:
- 在页面缓存逻辑中,不存字符串,而是用
file_put_contents(runtime_path('html_cache') . '/' . $filename . '.html', $content)写入真实 HTML 文件 - 在 Nginx 配置中添加规则:对匹配路径(如
^/article/(\d+)\.html$)尝试读取对应文件,存在则try_files $uri @php;不存在才交由 PHP 处理 - 注意:该方式需配合缓存失效机制(如更新文章时
unlink()对应 HTML 文件),否则内容不同步
替代方案:用 Redis + 前端 ETag 或 Last-Modified
若不想管理磁盘文件,可用 Redis 缓存完整响应体,并通过中间件设置标准 HTTP 缓存头:
- 中间件中计算响应内容的 md5 作为 ETag,或用最后更新时间作为 Last-Modified
- 客户端带
If-None-Match请求时,直接返回 304,不执行控制器逻辑 - 此方式不生成物理文件,但浏览器和服务端均能跳过渲染与传输,实测首屏 TTFB 可压至 5ms 内
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











