PHP 数组作为缓存容器的基础用法

3次阅读

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

PHP 数组作为缓存容器的基础用法

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() 仍快,但内存占用和序列化开销上升,需权衡
  • 引用与深拷贝要分清:缓存对象时,默认是引用;若后续修改原对象会影响缓存内容,必要时用 cloneunserialize(serialize($obj))
text=ZqhQzanResources