【问题标题】:Caching PDOStatement Object in Zend Framework在 Zend 框架中缓存 PDOStatement 对象
【发布时间】: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


【解决方案1】:

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

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

使用正常的数据库连接可能是正确的方法;如果您可以完全控制您的数据库,并且您正在使用 mySQL,您还可以考虑查看 mySQL query caching

【讨论】:

  • 数组可能最终成为我的解决方案。我当然会对这两个选项进行基准测试,看看哪个提供了最佳性能。
  • 所以查询平均需要 0.075 微秒。当我将其转换为数组并缓存时,获取结果需要 0.035 微秒。没有很大的性能提升,哦,好吧。感谢您的帮助!
  • 在加载可能较大的数组时注意内存限制问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多