2010-07-22 19 views
0

为了记录,我使用Windows Vista和XAMPP(PHP 5.3.1)。在Windows上使用PHP和APC发布缓存结果集

我想使用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类,并提取和存储是apc_fetch()和apc_store()只是抽象。 executeQuery是一个静态函数,在该代码写入的类中定义(很明显,用于执行查询)。

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

请注意。

+0

你可以做print_r($ query_result_res)并发布结果吗? – 2010-07-22 15:16:35

+0

我只是做了print_r(),这是我得到如下: 资源ID#16 – 2010-07-22 15:19:41

回答

1

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

但是,为什么不启用MySQL的查询缓存呢?它和这个完全相同。当然,它需要额外的TCP往返数据库服务器,但是当你插入/更新/删除表中的行时,它会自动从数据库中删除过时的缓存结果......除非你在同一个数据库上运行数百个查询页面,它应该是大致相同的性能明智的...

+0

无赖!好的,我有些怀疑这一点。谢谢你的提示。我没有使用MySQL缓存,因为我需要一个与数据库无关的解决方案,并且可以跨不同平台进行移植。 – 2010-07-22 15:42:46

1

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

事实上,你不能缓存任何其他的PHP 资源。 PHP资源是一种特殊的类型。变量本身只包含一个标识符和资源类型。该标识符可被接受该类型资源的函数使用以获取其数据并对其进行处理;然而,PHP本身并不知道这个值(包括它的大小以及是否依赖于其他资源)。

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

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

+0

非常感谢。我怀疑这一点,但我只是想确定。干杯。 – 2010-07-22 15:43:24