【发布时间】:2012-02-04 23:05:52
【问题描述】:
我正在尝试缓存不会经常更改(如果有的话)的查询结果。在我的类中,我有一个私有类变量private $_cache,在我的构造函数中,我用我的大部分缓存的方式初始化它:
// Setup caching
$frontendOptions = array('lifeTime' => (strtotime('+1 week') - time()));
$backendOptions = array('cache_dir' => '../application/cache');
$this->_cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
稍后,在一个函数中,我尝试缓存查询的结果:
$cache_id = 'all_station_results';
if ( ($results = $this->_cache->load($cache_id)) === false )
{
// Get all data from stations table
$sql="SELECT * FROM locations";
$sth = $this->_db->query($sql);
// Serialize query results
$data = serialize($sth);
// Write to cache
$this->_cache->save($data, $cache_id);
}
else
{
// Return results from cache
return unserialize($results);
}
这会引发异常:
您不能序列化或反序列化 PDOStatement 实例
所以我尝试不进行序列化,但抛出了这个异常:
数据必须是字符串或设置 automatic_serialization = true
现在,显然 PDOStatement 不是字符串,我看不出设置 automatic_serialization = true 和手动序列化之间的区别。
如何缓存这个 PDOStatement 对象?
【问题讨论】:
-
我不认为你可以序列化 PDO 对象。为什么不缓存一个包含结果的数组呢?
-
你到底想缓存什么?如果查询的结果不会很大,请考虑缓存结果而不是语句。
-
这绝对是一种可能性,但希望能够更改我的代码中执行该查询的任何位置,而是调用一个返回 PDOStatement 的函数,就好像我调用了`$this->_db ->query($sql) 但增加了缓存的性能优势。这样查询之后的代码就不必更改,因为它将在 PDOStatement 上运行并且不会知道其中的区别。
-
假设您可以缓存该语句。那么这是否意味着每次获取缓存语句并使用它时查询仍会访问您的数据库?或者,数据库是否只会在第一次被击中?
-
@RobApodaca
locations表有 2,792 行和 14 列,最终成为一个相当大的数据集。是的,这就是它被标准化......哈哈。
标签: php zend-framework caching pdo