PHP 8.1 不调用 HTML,而是动态生成并输出 HTML;需区分服务端模板缓存(如 ThinkPHP 的编译缓存)、HTTP 响应缓存(通过 Cache-Control 等头控制)和静态 HTML 缓存(自动生成 .html 文件),三者配置方式与作用层级不同,且 PHP 8.1 下需注意 OPCache 排除路径、英文路径优先及运行用户权限。

PHP 8.1 本身不“调用 HTML”,而是生成或输出 HTML 内容;所谓“调用 HTML”,通常指 动态渲染模板、输出页面并控制其缓存行为。关键在于区分两类缓存:一是 服务端模板编译缓存(如 ThinkPHP 的 template cache),二是 客户端/代理层的 HTTP 页面缓存(即浏览器看到的 .html 响应)。两者目标不同,配置方式也不同。
启用并控制服务端模板缓存(以 ThinkPHP 为例)
ThinkPHP 在 PHP 8.1 下默认启用模板缓存,但需确保配置合规,否则易报 TemplateException 或缓存不更新:
- 确认
template.cache开启:'cache' => true(开发环境建议设为false) - 检查
template_cache_path是否合法:含../或非 ASCII 字符(如中文路径)会被静默忽略,退回到默认runtime/template/;用var_dump(config('template.template_cache_path'))确认真实路径 -
cache_prefix避免为空或纯数字,推荐设为带项目标识的字符串,如'tp8_shop_',防止哈希冲突 - 开启 layout 时,所有
{include}文件变动都会导致整页缓存失效;高频变动区块改用{widget}或 Ajax 加载
设置 HTTP 层页面缓存(让浏览器或 CDN 缓存 HTML 响应)
这是真正让“HTML 被缓存”的环节,通过发送标准 HTTP 头实现:
- 在输出 HTML 前调用:
header('Cache-Control: public, max-age=3600');(缓存 1 小时) - 对静态化页面可加 ETag 或 Last-Modified:
header('ETag: "' . md5_file($html_path) . '"'); - 避免
Cache-Control: no-store或Pragma: no-cache等禁用缓存的头 - 注意:必须在任何输出(包括空格、BOM、
echo)之前设置 header,否则会报 “Headers already sent”
启用静态 HTML 缓存(ThinkPHP 的 HTML_CACHE_ON)
该功能将动态 URL(如 /index/index)自动映射并生成真实 .html 文件,适合内容更新不频繁的页面:
立即学习“PHP免费学习笔记(深入)”;
- 在配置中开启:
'HTML_CACHE_ON' => true,'HTML_CACHE_TIME' => 3600(单位秒) - 缓存文件默认生成在
html/目录下(可配HTML_CACHE_RULES指定规则) - 首次访问触发生成,后续请求直接由 Web 服务器(如 Nginx)读取静态文件,完全绕过 PHP
- 需确保 Web 服务用户对
html/目录有写权限,且 Nginx/Apache 配置允许读取.html后缀
PHP 8.1 特别注意事项
升级到 PHP 8.1+ 后,以下问题更常见,直接影响 HTML 输出与缓存表现:
- OPCache 若未排除
runtime/和html/目录,可能缓存了旧的编译结果,导致改了模板也不生效;建议在php.ini中加:opcache.file_exclude=".*runtime.*|.*html.*" - 模板路径含中文或 emoji 时,PHP 8.1+ 的哈希算法可能不稳定,导致缓存命中失败;统一使用英文路径和文件名
- 运行用户(如
www-data)必须对runtime/template/、html/等目录有读写权限,用chown -R www-data:www-data runtime html而非chmod 777



















