php数组可作单请求内存缓存:用关联数组实现o(1)键值存取,支持手动过期控制(存时间戳)、作用域需设为静态/全局,避免对象作键、大数组及引用陷阱。

PHP 数组天然适合作为轻量级内存缓存容器,尤其在单次请求生命周期内临时存储重复计算结果、数据库查询片段或配置数据,无需引入 Redis 或 APCu 等外部扩展。
用普通数组模拟键值缓存
利用关联数组的 O(1) 查找特性,可快速实现“键 → 值”的映射缓存:
- 定义一个全局或类属性数组(如 $cache = [])作为缓存池
- 写入:直接赋值 $cache['user_123'] = $userData;
- 读取:先检查是否存在 isset($cache['user_123']),再取值,避免 Notice
- 删除:用 unset($cache['user_123']) 即可,不需手动重置键
带存在性与过期判断的简易封装
纯数组无自动过期机制,但可通过时间戳+有效期手动控制:
- 缓存时存数组: $cache['config'] = ['data' => $cfg, 'expire' => time() + 300];(5分钟过期)
- 读取时检查:if (isset($cache[$key]) && $cache[$key]['expire'] > time()) { return $cache[$key]['data']; }
- 建议封装成简单函数(如 cacheGet() / cacheSet()),避免重复逻辑
注意作用域与生命周期边界
数组缓存仅在当前请求中有效,无法跨请求共享:
立即学习“PHP免费学习笔记(深入)”;
- 不要在 CLI 脚本中误以为能复用 Web 请求的缓存数组
- 函数内定义的局部数组每次调用都会重建,应提升到类属性、静态变量或全局作用域(推荐用类静态属性管理)
- 若需跨请求缓存,请改用 file_put_contents()/apcu_store()/redis 等持久化方案
避免常见陷阱
看似简单,实际容易踩坑:
- 键名别用复杂结构:避免直接用对象或含特殊字符的字符串作键(如 $cache[$obj] 会触发 __toString 或报错),优先转成稳定字符串(如 md5(serialize($params)))
- 大数组影响性能:单次缓存超万条数据时,isset() 仍快,但内存占用和序列化开销上升,需权衡
- 引用与深拷贝要分清:缓存对象时,默认是引用;若后续修改原对象会影响缓存内容,必要时用 clone 或 unserialize(serialize($obj))











