0

仅作记录,我使用的是带有 XAMPP (PHP 5.3.1) 的 Windows Vista。

我正在尝试使用 APC 来缓存数据库结果。我对字符串变量做了一个简单的 APC 测试,它似乎工作正常。但是,当我尝试对数据库结果资源执行相同操作时,每当我想使用缓存中的数据“不是有效的 MySQL 结果资源”时,我都会收到投诉。

这是我的代码:

$key_hash_str = md5($query_sql_str);
$cache_res = Mox_Cache_APC::fetch($key_hash_str);;

switch(true)
{
case (!$cache_res):
    $query_result_res = self::executeQuery($query_sql_str);
    Mox_Cache_APC::store($key_hash_str, $query_result_res);
    return $query_result_res;                   
break;

default:
    return $cache_res;
}

Mox_Cac​​he_APC 是我的 APC 类,而 fetch 和 store 只是 apc_fetch() 和 apc_store() 的抽象。executeQuery 是在编写此代码的类中定义的静态函数(很明显,用于执行查询)。

难道我做错了什么?在缓存结果集之前我需要对结果集做些什么吗?

好心提醒。

4

2 回答 2

1

简短的回答:您不能存储原始结果资源。您可以将它获取到本机数组(使用类似的东西mysql_fetch_assoc())然后存储它,但不是资源。

但是,为什么不只启用 MySQL 的查询缓存呢?它的作用与此完全相同。当然,它需要到数据库服务器的额外 TCP 往返,但是当您从表中插入/更新/删除行时,它会自动修剪数据库中的陈旧缓存结果......除非您在同一台上运行数百个查询页面,它应该具有相同的性能......

于 2010-07-22T15:26:00.013 回答
1

这是可以预料的。您不能缓存数据库资源。

事实上,您不能缓存任何其他 PHP资源。PHP 资源是一种特殊类型。变量本身只包含一个标识符和资源类型。接受该类型资源的函数可以使用该标识符来获取其数据并对其进行操作;但是,PHP 本身对这个值一无所知(包括它有多大以及它是否依赖于其他资源)。

也没有通用的序列化机制可以由提供资源的扩展来实现,就像对象一样。因此,不可能缓存资源。

如果需要,可以以数组形式缓存结果。

于 2010-07-22T15:26:09.827 回答