wx.setStorage 和 wx.getStorage 必须监听 fail 回调、校验数据存在性、加版本前缀 key;PHP 应用 Redis 做二级缓存,配合 cache_sign 校验、合理过期与分层 key 设计,并避免高频/超限写入。

小程序端 wx.setStorage 和 wx.getStorage 怎么用才不丢数据
微信小程序本地缓存不是万能的,wx.setStorage 写入失败时不会抛异常,而是走 fail 回调,很多人没监听就以为写进去了。尤其在 iOS 上,如果用户主动清理微信缓存或系统空间不足,wx.getStorage 可能直接返回 errMsg: "getStorage:fail data not found"。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 每次
wx.setStorage都必须写fail回调,记录错误日志(比如上报到自己的监控接口) - 读取时别直接解构,先判断
res.data是否存在且非空字符串,避免 JSON.parse 报错 - 敏感数据(如登录态 token)不要只依赖本地缓存,服务端仍需校验
session_key有效性 - 缓存 key 建议加版本前缀,比如
"v2_user_profile_" + uid,便于灰度更新时自动失效旧数据
PHP 后端怎么配合做二级缓存(Redis + 小程序 Storage)
小程序端缓存只是“快”,但不可信;PHP 后端缓存才是“稳”。常见错误是把所有逻辑都压到前端,结果用户改本地时间、清缓存、换设备后状态全乱。正确做法是:前端只缓存非关键、可降级的数据(如商品列表、配置项),PHP 用 Redis 存真实状态,并设置合理过期时间。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- PHP 接口返回数据时,顺带返回一个
cache_sign字段(比如 md5(serialize($data) . $timestamp)),小程序存起来;下次请求前比对本地缓存的 sign,不一致就主动丢弃并重拉 - Redis key 命名用冒号分隔层级,例如
"wx:user:profile:12345",避免 key 冲突和扫描困难 - 不要给所有接口加缓存,像支付回调、订单提交这类写操作,必须绕过缓存直连 DB
- 用
Redis::setex()而非set(),强制设置过期,防止脏数据长期滞留
为什么 wx.setStorageSync 在真机上有时不生效
wx.setStorageSync 看似“同步”,其实底层仍是异步 I/O,只是阻塞当前 JS 线程。真机(尤其是低端安卓)上,如果连续高频调用(比如在 onShow 里反复 set),可能触发微信的写入限频策略,导致部分写入静默失败,且无任何提示。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 避免在生命周期钩子中密集写缓存,合并数据后单次写入,例如把多个字段拼成一个对象再存:
wx.setStorageSync('cache_bundle', { a: 1, b: 2, ts: Date.now() }) - 写入前先用
wx.getStorageSync检查是否已存在且内容一致,减少冗余 I/O - 调试时打开微信开发者工具的「Storage」面板,手动刷新看 key 是否真的出现;真机测试务必用「体验版」而非开发版,开发版的缓存行为有差异
- 超过 10MB 的单个 value 会直接失败,微信限制是 10MB 总容量、单条最大 10MB —— 实际建议单条不超过 2MB,留出余量
PHP 返回 JSON 给小程序时,怎么让缓存更可控
小程序默认会对 GET 请求做 HTTP 缓存(基于响应头),但微信底层不完全遵循标准,比如 Cache-Control: no-cache 有时被忽略。单纯靠前端加时间戳参数(?t=123)又污染 URL、浪费 CDN 流量。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- PHP 接口统一用 POST(即使只是查询),彻底规避 HTTP 缓存干扰
- 必须用 GET 时,在 header 中显式禁用:
header('Cache-Control: no-store, must-revalidate');,注意不能只写no-cache - 接口返回体里带上
etag字段(如 md5 输出内容),小程序下次请求时通过自定义 header(如X-If-None-Match)传回,PHP 判断是否命中再决定返回 304 或完整数据 - 不要依赖 $_SERVER['HTTP_REFERER'] 做来源校验,小程序环境该字段常为空或不可靠
缓存不是开关,是权衡:前端快但脆弱,PHP 稳但有延迟,Redis 居中但要防雪崩。最易被忽略的是——没有缓存淘汰策略的代码,上线三天后就开始拖慢整个接口。











