我正在尝试缓存查询结果,该结果不会经常更改(如果有的话)。在我的类中,我有一个私有(private)类变量 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);
}
这会引发异常:
You cannot serialize or unserialize PDOStatement instances
所以我尝试不进行序列化,但抛出了这个异常:
Datas must be string or set automatic_serialization = true
现在,显然 PDOStatement 不是字符串,我看不出设置 automatic_serialization = true
和手动序列化之间的区别。
如何缓存此 PDOStatement 对象?
最佳答案
据我所知,您根本无法序列化 PDO 对象:它们与底层数据库驱动程序和当前打开的连接紧密耦合。
您必须缓存一个包含数据库调用结果的数组。但这可能不一定有助于您的性能:从缓存中获取大量数据(或将其全部存储在 PHP 脚本的内存中) )可能需要与进行数据库调用一样长的时间,尤其是在表已正确索引的情况下。
使用普通的数据库连接可能是正确的方法;如果您可以完全控制数据库,并且正在使用 mySQL,您还可以考虑查看 mySQL query caching .
关于php - 在 Zend Framework 中缓存 PDOStatement 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9141713/