如何将PHP的mysqli_result转换为可序列化数组并存储至缓存
无法直接存储mysqli_result到缓存的解决方案
核心结论
不能直接存储未提取的mysqli_result对象到Redis或Memcached,原因是:
mysqli_result是与数据库连接绑定的资源对象,并非独立的可序列化数据结构- 它依赖底层数据库连接存活,一旦连接关闭,对象就会失效
- PHP无法序列化这类包含底层资源句柄的对象
可行实现方案
方案1:直接存储提取后的结果数组
这是最简单的方式,先把结果集提取为普通数组,序列化后存入缓存:
// 执行查询并提取所有结果为关联数组 $result = mysqli_query($connection, "SELECT ... query"); $rows = mysqli_fetch_all($result, MYSQLI_ASSOC); // 序列化后存入Redis $redisObject->save("query_x", serialize($rows)); // 从缓存取出并反序列化使用 $cachedRows = unserialize($redisObject->get("query_x")); // 直接遍历数组处理数据 foreach ($cachedRows as $row) { echo $row['column_name']; }
方案2:模拟mysqli_result的行为(可选)
如果需要保持类似mysqli_result的调用方式(比如用fetch_assoc逐行获取),可以自定义一个类封装数组,模拟原对象的方法:
class CachedMysqliResult { private $rows; private $currentIndex = 0; public function __construct(array $rows) { $this->rows = $rows; } // 模拟mysqli_result的fetch_assoc方法 public function fetch_assoc() { if ($this->currentIndex >= count($this->rows)) { return null; } return $this->rows[$this->currentIndex++]; } // 可选:添加fetch_array等其他需要的方法 public function fetch_array() { $row = $this->fetch_assoc(); return $row ? array_merge($row, $row) : null; // 模拟MYSQLI_BOTH模式 } } // 存入缓存的逻辑和方案1一致 $result = mysqli_query($connection, "SELECT ... query"); $rows = mysqli_fetch_all($result, MYSQLI_ASSOC); $redisObject->save("query_x", serialize($rows)); // 取出后转换为自定义对象 $cachedRows = unserialize($redisObject->get("query_x")); $cachedResult = new CachedMysqliResult($cachedRows); // 用熟悉的方式调用fetch_assoc while ($row = $cachedResult->fetch_assoc()) { echo $row['column_name']; }
关键说明
无论哪种方案,都必须先将mysqli_result中的数据提取为普通数组(或其他可序列化结构),因为只有纯数据结构才能被序列化并持久化到缓存中。原mysqli_result对象无法脱离数据库连接独立存在,因此不能直接存储。
内容的提问来源于stack exchange,提问作者ondercsn
相关产品推荐
相关产品推荐

