仅供记录,我正在使用Windows Vista和XAMPP(PHP 5.3.1)。
我正在尝试使用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_Cache_APC是我的APC类,fetch和store只是apc_fetch()和apc_store()的抽象。 executeQuery是在编写此代码时在类中定义的静态函数(很明显,用于执行查询)。
我做错了吗?在缓存之前,我需要对结果集做些什么吗?
请告知。
答案 0 :(得分:1)
简答:您无法存储原始结果资源。您可以将其提取到本机数组(使用类似mysql_fetch_assoc()
之类的内容)然后存储它,但不能存储它。
但是,为什么不启用MySQL的查询缓存呢?它与此完全相同。当然,它需要额外的TCP往返数据库服务器,但是当你从表中插入/更新/删除行时,它会自动从数据库中删除过时的缓存结果...除非你在同一个数据库上运行数百个查询页面,它应该是相同的性能明智...
答案 1 :(得分:1)
这是可以预料的。您无法缓存数据库资源。
实际上,您无法缓存任何其他PHP 资源。 PHP资源是一种特殊类型。变量本身仅包含标识符和资源类型。接受该类型资源的函数可以使用该标识符来获取其数据并对其进行操作;但是,PHP本身对该值一无所知(包括它有多大以及它是否依赖于其他资源)。
也没有一般的机制化机制,可以通过提供资源的扩展来实现,就像对象一样。因此,无法缓存资源。
如果需要,可以以数组形式缓存结果。