thinkphp 6.1 的静态缓存不支持 ajax 请求,因其仅缓存完整 html 页面且跳过 php 执行,而 ajax 返回 json 等非页面内容、不走模板渲染流程;应改用请求缓存或手动 cache 控制。

ThinkPHP 6.1 的静态缓存(HTML 缓存)**不支持缓存 AJAX 请求**,这是由机制决定的,不是配置能绕过的。
为什么静态缓存对 AJAX 无效
静态缓存的本质是:在控制器执行 display() 渲染模板后,把最终生成的完整 HTML 字符串写入文件,下次同 URL 请求直接读取该 HTML 文件返回,跳过整个 PHP 执行流程。
AJAX 请求通常有以下特点,与静态缓存冲突:
- 请求头常带
X-Requested-With: XMLHttpRequest或自定义 header,而静态缓存只认 URL 和 GET 参数,不区分请求类型或 header - 返回内容多为 JSON、纯文本或片段 HTML,不是完整页面,
display()基本不用,也就没有“渲染后 HTML”可缓存 - 静态缓存规则依赖
{:module}_{:action}等模板变量,AJAX 接口往往走 API 模块(如api/v1/login),本身就不走模板渲染流程 - 即使强行让某个 AJAX 接口调用
display(),它返回的也是结构化数据,浏览器端 JS 解析时会出错(比如把 JSON 当 HTML 插入)
替代方案:用请求缓存(Route Cache)
TP6.1 更适合 AJAX 场景的是「请求缓存」——它缓存的是整个 HTTP 响应体(含状态码、header、body),不依赖模板,且支持任意返回格式(JSON、XML、text 等)。
配置方式(在 route/app.php 中):
- 缓存固定时间:
Route::get('api/user/info', 'api.User/info')->cache(300); // 缓存 5 分钟 - 缓存并带动态键名(推荐):
Route::get('api/news/:id', 'api.News/read')->cache(['news_%id%', 3600]); - 带缓存标签,便于批量清理:
Route::get('api/product/:id', 'api.Product/detail')->cache(['product_%id%', 1800, 'product']);
注意:该缓存自动识别 GET/POST 方法,但 POST 请求需确保参数可序列化;若接口逻辑含用户身份判断(如 token 验证),则不能缓存,否则会把 A 用户的数据返回给 B 用户。
需要缓存动态数据?用 Cache 类手动控制
对于必须个性化、但部分数据可复用的 AJAX 接口(例如用户首页推荐列表),建议在控制器中手动使用缓存:
- 先查缓存:
$data = cache('user_recommend_' . $uid); - 缓存未命中再查库+处理,最后写入:
cache('user_recommend_' . $uid, $data, 600); - 关键操作(如用户更新偏好)后主动删除:
cache('user_recommend_' . $uid, null);
这种方式灵活、可控,且天然适配无状态 API 场景,比静态缓存更可靠。
静态缓存只适用于传统模板驱动的展示页,AJAX 接口请转向请求缓存或手动 Cache 控制。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











