静态缓存核心是绕过php与数据库,将html存为物理文件直接由web服务器返回;thinkphp6需开启html_cache_on、设html_cache_time、匹配get无参路由或显式声明cache规则,并配合nginx/cdn实现真正零数据库压力。

静态缓存本身不直接提升数据库性能,它绕过 PHP 执行和模板编译,把动态页面生成的 HTML 直接存为物理文件,从而完全跳过数据库查询——这才是它降低数据库压力的核心逻辑。配置关键不在“开不开”,而在“什么页面该缓存、缓存多久、怎么自动失效”。
确认静态缓存是否真正启用并生效
ThinkPHP 6.0 的静态缓存由 think\middleware\CheckRequestCache 中间件驱动,需同时满足三个条件:
- 在
config/app.php中开启:'html_cache_on' => true - 设置缓存时间:
'html_cache_time' => 3600(单位秒,0 表示永久) - 确保路由匹配规则支持缓存:默认只对 GET 请求且无参数的 URL 缓存;如需带参数缓存,需在路由定义中显式添加
['cache' => 3600]选项
验证方式:首次访问某页面后,检查 runtime/html/ 目录下是否生成对应路径的 .html 文件(如 runtime/html/index/index.html)。若无生成,说明中间件未命中或被其他中间件拦截。
只对“读多写少+无用户态”的页面启用
静态缓存适合首页、文章列表、产品分类页等不依赖登录态、不随用户变化、更新频率低的页面。以下情况必须禁用或排除:
- 含
session、cookie或用户信息的页面(如会员中心) - URL 带
?id=123这类动态参数但未在路由中声明 cache 规则的页面 - 使用了
$this->assign()注入实时时间、随机数、未缓存的用户数据等变量的模板
错误做法:给整个后台系统开启静态缓存——这会导致管理员看到过期内容,甚至缓存登录表单,引发安全风险。
配合手动清除与自动失效机制
静态文件不会自动感知数据库变更,必须主动触发清理:
- 内容更新时调用:
Cache::tag('article')->clear()(需提前用 tag 标记缓存) - 或删除指定 HTML 文件:
unlink(runtime_path('html') . 'article/detail_123.html') - 更稳妥的做法:在控制器操作成功后,执行
app()->http->getMiddleware()->clearHtmlCache('article/index')(需自定义封装)
不要依赖“缓存过期自动删”,因为 HTML 文件一旦生成,就只是普通文件;OPcache 不会管它,Web 服务器也不会自动清理——它只会静静躺在那里,直到你动手或定时任务介入。
生产环境必须搭配反向代理缓存
仅靠 TP6 的静态缓存,每次请求仍要走一遍 PHP 生命周期(路由解析、中间件链、响应发送)。真正减压数据库,应让 Nginx 或 CDN 直接返回 HTML 文件,彻底不进 PHP:
- Nginx 配置示例:匹配
/index.html路径,直接try_files $uri @php,命中即 200 返回,不转发给 PHP-FPM - CDN 层面对
/*.html设置 TTL,让全球边缘节点缓存,连你的服务器都不用触达
此时数据库压力趋近于零——因为 99% 的流量根本没走到应用层。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











