thinkphp 6.1 的 html 静态缓存不适用于微信小程序后端接口,因其绕过 php 执行逻辑,导致鉴权失败、session_key 解密异常、数据库写入缺失及微信回调失效;应关闭 html_cache_on,改用 redis 缓存只读数据,并由 nginx/cdn 缓存前端静态资源。

ThinkPHP 6.1 的静态缓存(如 html 缓存或 cache:build 生成的静态页面)不适合直接用于微信小程序后端接口,因为小程序调用的是动态 API(如登录、获取用户信息、提交订单等),这些接口必须实时响应、带鉴权、处理 session_key、解密数据等,而静态缓存会绕过 PHP 执行逻辑,导致:
- 无法校验 token 或 Redis 中的 session_key
- 无法处理
encryptedData解密所需的二进制 session_key - 无法执行数据库写入(如记录评分、更新库存)
- 微信服务器回调(如支付通知、订阅消息)会直接失败
所以,不要给小程序 API 接口开启 HTML 静态缓存。但你可以且应该做的是:对「只读、低频变更、高并发访问」的前端资源或数据做合理缓存,分两类处理:
H3 缓存小程序前端静态资源(JS、WXML、JSON、图片)
这类文件由小程序客户端下载,不经过 ThinkPHP 后端逻辑,应交由 Web 服务器(Nginx/Apache)或 CDN 控制缓存:
- 在 Nginx 配置中添加:
location ~* \.(js|wxml|json|wxss|png|jpg|jpeg|gif|ico|svg)$ { expires 1h; add_header Cache-Control "public, immutable"; } - 小程序
project.config.json中确保miniprogramRoot指向正确,构建产物(miniprogram/)由 Nginx 直接托管,不走 PHP 路由。
H3 对小程序后端接口做「数据级缓存」(推荐用 Redis)
ThinkPHP 6.1 原生支持 Redis 缓存驱动,适合缓存:
公众号运营:文章发布至草稿、样式封面、评论与用户管理、数据统计等。用户要求将 Markdown 发送到公众号草稿、查看阅读量统计或类似后台操作时,使用本技能。
- 电影/菜品/活动等基础列表(
GET /api/v1/movies) - 省市区三级数据、分类树、广告位配置
- 用户公开资料(非敏感字段,如昵称、头像 URL)
操作方式(以 app/controller/Api/MovieController.php 为例):
- 开启 Redis 缓存驱动(确认
config/cache.php中默认驱动为redis) - 在方法中手动读写:
use think\facade\Cache;
public function list() { $cacheKey = 'movies:list:all'; $data = Cache::get($cacheKey); if ($data === null) { $data = MovieModel::where('status', 1)->select()->toArray(); Cache::set($cacheKey, $data, 3600); // 缓存 1 小时 } return json($data); }
> ⚠️ 注意:涉及用户私有数据(如“我的订单”)、需鉴权的接口、或实时性要求高的场景(如库存、倒计时),**禁止缓存响应体**;可缓存中间计算结果(如商品分类统计数),但必须配合缓存失效策略(如下单成功后 `Cache::delete('goods:stock:'.$id)`)。
---
### H3 避免误用 `html` 缓存模块
ThinkPHP 的 `think-cache-html` 扩展(或旧版 `html` 缓存)是为传统 PC 网站页面设计的,它会把整个 HTTP 响应(含 headers、JSON body)存成 `.html` 文件,并跳过控制器执行。
在小程序场景下启用它会导致:
- `token` 鉴权中间件不执行 → 未授权请求也能拿到缓存的旧数据
- `session_key` 解密逻辑被跳过 → 手机号解密永远失败
- 错误码(如 40029)无法返回,前端收不到明确提示
✅ 正确做法:关闭该功能
检查 `config/app.php` 中是否含有:
```php
'html_cache_on' => true,
'html_cache_compile' => true,
如有,请设为 false;并删除 runtime/html 目录下所有文件。
不复杂但容易忽略:缓存的价值不在“全开”,而在“精准命中”。小程序后端真正需要的不是静态页缓存,而是基于业务语义的数据缓存 + 客户端本地存储(wx.setStorageSync)+ CDN 资源缓存三层协同。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










