memcaching php资源对象

时间:2010-10-26 00:39:52

标签: php mysql memcached

说我在PHP中有这个代码:

$query = mysql_query("SELECT ...");

该语句返回一个资源对象。通常它会传递给mysql_fetch_array()或其中一个mysql_fetch_ *函数来填充数据集。

我想知道资源对象 - 在这种情况下的$ query变量是否可以缓存在memcache中,然后稍后可以获取并使用它就像它创建的时刻一样。

// cache it
$memcache->set('query', $query);

// restore it later
$query = $memcache->get('query');

// reuse it
while(mysql_fetch_array($query)) { ... }

我搜索了这个问题,运气不好。

我问这是因为它看起来比“首先填充结果数组然后缓存”的方式重量轻。

有可能吗?

2 个答案:

答案 0 :(得分:2)

我对此表示怀疑。从序列化手册条目

serialize()处理除资源类型之外的所有类型。

编辑:资源通常与创建它们的服务相关联。我不知道memcached是否使用序列化,但我猜它会受到相同的限制。

答案 1 :(得分:2)

Memcache扩展在将对象发送到Memcached服务器之前对其进行序列化。正如另一张海报所提到的,资源无法序列化。资源基本上是对数据库服务器的网络连接的引用。您无法缓存网络连接并在以后重复使用。您只能缓存通过连接传输的数据。

使用这样的查询,您应该在缓存之前获取所有行。

$all_results = array();
while ($row = mysql_fetch_array($query)) {
    $all_results[] = $row;
}
$memcache->set('query', $all_results);

现代数据库驱动程序(如MySQLi和PDO)具有fetch_all()函数,可以获取所有行。这简化了一些事情。

稍后检索该数组时,可以使用foreach()进行迭代。这不适用于非常大的查询结果(Memcached有1MB的限制),但对于大多数用途,你应该没有任何问题。