php - 在 Zend Framework 中缓存 PDOStatement 对象

标签 php zend-framework caching pdo

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

相关文章:

c# - 启用 OutputCache 时 session 丢失

c# - 在 asp.net 中缓存(输出)?

用于生成 EML 电子邮件文件的 PHP 库?

php - PDO + PHP lastInsertId() 问题

api - 如何使用 Zend 框架创建公共(public) API?

c++ - 判断缓存是回写还是通过

javascript - 将十六进制值与 SQLite 查询(如 JavaScript)匹配

php - 如何通过网络向手机发送消息?

zend-framework - 设置超时 SOAP 客户端 (Zend Framework)

zend-framework - Zend_Controller_Action_Exception 未显示 404 页面