在Zend Framework中缓存PDOStatement对象


Caching PDOStatement Object in Zend Framework

我正在尝试缓存一个查询的结果,该查询不会经常更改(如果有的话)。在我的类中,我有一个私有类变量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对象

AFAIK,您根本无法序列化PDO对象:它们与底层数据库驱动程序和当前打开的连接紧密耦合。

您必须缓存一个数组,该数组包含数据库调用的结果。不过,这可能不一定有助于您的性能:从缓存中提取大量数据(或将其全部存储在PHP脚本的内存中)可能需要与数据库调用一样长的时间,尤其是在表被正确索引的情况下。

使用正常的数据库连接可能是正确的方法;如果您可以完全控制数据库,并且正在使用mySQL,那么还可以考虑使用mySQL查询缓存。