thinkphp 5.0 的静态缓存仅支持 html 页面缓存,不支持直接缓存 json 数据;需用 cache::set()/get() 配合 serialize() 手动缓存接口数据,或自定义 json 文件缓存工具。

ThinkPHP 5.0 的静态缓存本身不直接支持“JSON数据缓存”这一说法——它缓存的是 HTML 页面(即渲染后的完整 HTML 字符串),不是原始 JSON 格式的数据。如果你的目标是让接口返回的 JSON 响应被缓存(比如 API 接口 /api/user 返回 {"id":1,"name":"张三"}),那这属于「响应内容缓存」,应使用 ThinkPHP 的通用缓存驱动(如 File、Redis)配合手动序列化,而非「静态缓存」(HTML 缓存)。
别混淆:静态缓存 ≠ JSON 缓存
ThinkPHP 的「静态缓存」特指 将控制器输出的 HTML 页面保存为 .html 文件,下次请求直接读取该文件,跳过模板渲染和逻辑执行。它默认路径由 HTML_PATH 决定,实际对应 APP_PATH/Html/ 目录(非 Runtime/),与 JSON 数据无关。
所以:
- ✅ 你要缓存 JSON 接口结果 → 用 Cache::set() / Cache::get() 配合 serialize()
- ❌ 不要用 buildHtml() 或 HTML_PATH 配置来“存 JSON”
正确缓存 JSON 数据的方法(推荐)
在控制器中手动缓存接口数据,步骤如下:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- 对要缓存的对象或数组调用
serialize()(不是json_encode()),尤其当数据含对象实例时; - 用
Cache::set('api_user_123', $data, 3600)存入; - 取值时用
$data = Cache::get('api_user_123'),框架自动反序列化; - 若只需缓存纯数组结构(无方法、无私有属性),且需跨语言兼容,可改用
json_encode()/json_decode(),但需自行处理类型转换。
如果坚持用文件方式“伪静态 JSON”
虽不推荐,但可模仿你知识库中的 file 类逻辑,自定义一个 JSON 文件缓存工具:
- 指定缓存目录,例如
ROOT_PATH . 'runtime/json_cache/'; - 文件名用键名 +
.json后缀(如user_123.json); - 写入前
json_encode($data, JSON_UNESCAPED_UNICODE); - 读取后
json_decode($content, true); - 注意权限:确保目录可写,且 Web 服务器无法直接通过 URL 访问该目录(避免泄露)。
关键提醒
ThinkPHP 5.0 默认缓存驱动(File)底层已用 serialize() 包装,所以直接调用 Cache::set() 即可安全存对象;自己再套一层 json_encode() 反而会导致取出来是字符串,需要额外 json_decode(),容易出错。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










