伪静态仅改变url格式,不提供缓存功能;缓存需单独配置请求缓存或静态缓存,二者机制不同、不可混用,且伪静态后缀不影响缓存逻辑与key生成。

伪静态本身不带缓存能力,它只是 URL 形式改造;真正起缓存作用的是请求缓存(request_cache)或静态缓存(HTML_CACHE_ON),两者机制完全不同,不能混用或指望伪静态自动触发缓存。
伪静态后缀配置不影响缓存逻辑
ThinkPHP 的伪静态由 url_html_suffix 控制,比如设为 'html|shtml',只改变路由匹配和 URL 输出格式,对缓存无任何影响。即使访问 /user/index.html,框架仍按普通 GET 请求处理,不会因此启用 HTML 静态文件读取——除非你额外开启并配好静态缓存。
- 伪静态后缀仅用于路由识别和链接生成,
Request::ext()能拿到后缀名,但不参与缓存决策 - 不要以为加了
.html就等于“页面被静态化”了,那只是个假后缀 - 若同时启用伪静态和请求缓存,缓存 key 仍基于原始路由(如
user/index),不是user/index.html
请求缓存(request_cache)必须显式开启且限定 GET
这是最轻量、最常用的缓存方式,但容易因配置位置或条件遗漏而失效。
- 全局开启:在
middleware.php中加入think\middleware\CheckRequestCache中间件 - 时间设置:在
route.php或应用配置中定义request_cache_expire,单位秒,例如3600 - 仅对 GET 请求生效,POST/PUT/DELETE 不缓存;带查询参数的 URL(如
?id=5)会被完整计入缓存 key - 缓存内容是整个响应体(含 header 和 body),第二次命中直接返回 304 或内容,不执行控制器逻辑
- 注意:如果控制器里用了
session_start()或输出了 header,可能干扰缓存中间件行为
静态缓存(HTML_CACHE_ON)需三要素齐全才生效
这才是真正生成 .html 文件、绕过 PHP 执行的“硬缓存”,但配置门槛高,漏一项就静默失败。
- 必须在主配置中开启:
'HTML_CACHE_ON' => true,且'HTML_PATH'指向可写目录(如./html) - 必须存在
htmls.php规则文件(路径通常为config/htmls.php或旧版Conf/htmls.php),内容形如:return ['index' => ['{:action}', 3600]]; -
HTML_READ_TYPE决定读取方式:0表示原路径直接读 HTML 文件;1表示 302 重定向到 HTML 文件路径——后者需 Web 服务器(Nginx/Apache)能直接服务该路径 - 伪静态后缀(如
.html)和静态缓存是正交关系:你可以用/index.html访问,但缓存文件实际叫index.html,前提是规则里写了'{:action}'且HTML_READ_TYPE = 0
多语言场景下,缓存与 lang() 调用要分层处理
伪静态 + 缓存 + 多语言叠加时,最容易掉进「语言包重复加载」坑里,性能损耗远大于缓存收益。
- 请求缓存或静态缓存生效时,
lang()函数调用本身不执行——但语言包加载发生在缓存生成阶段,所以首次生成仍要加载全部语言文件 - 关键动作:必须提前运行
php think build:lang生成编译缓存,否则每次生成静态页或响应缓存时都会重新 require 所有zh-cn/*.php - 模板中禁用
{:lang('xxx')},改用控制器预赋值:$this->assign('i18n', ['login' => lang('login')]),再在模板用{$i18n.login} - 如果使用 URL 路由式多语言(如
/zh/user/login),确保不同语言版本缓存 key 分离,否则中文页可能返回英文缓存内容
伪静态和缓存是两套独立机制,强行捆绑反而容易互相干扰;真正卡顿的地方往往不在 URL 格式,而在语言包加载、模板解析、未优化的字段查询这些底层链路——先跑通 build:lang 和 optimize:config,比纠结后缀更有实际效果。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











