You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:48:15