Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Zend框架中缓存PDOStatement对象_Php_Zend Framework_Caching_Pdo - Fatal编程技术网

Php 在Zend框架中缓存PDOStatement对象

Php 在Zend框架中缓存PDOStatement对象,php,zend-framework,caching,pdo,Php,Zend Framework,Caching,Pdo,我正在尝试缓存一个查询的结果,如果有的话,它不会经常更改。在我的类中,我有一个私有类变量private$\u cache,在我的构造函数中,我以使用大多数缓存的方式初始化它: // Setup caching $frontendOptions = array('lifeTime' => (strtotime('+1 week') - time())); $backendOptions = array('cache_dir' => '../application/cache'); $t

我正在尝试缓存一个查询的结果,如果有的话,它不会经常更改。在我的类中,我有一个私有类变量
private$\u 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);           
}
这会引发一个异常:

不能序列化或取消序列化PDO语句实例

因此,我尝试不序列化,但引发了以下异常:

数据必须为字符串或设置为自动\u序列化=true

现在,显然PDO语句不是字符串,我看不出设置
automatic_serialization=true
和手动序列化之间的区别


如何缓存此PDO语句对象?

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

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


使用正常的数据库连接可能是正确的方法;如果你完全控制了你的数据库,而你在使用MySQL,你也可以考虑查看。

我认为你不能序列化PDO对象。为什么不缓存一个包含结果的数组呢?您到底想缓存什么?如果查询的结果不会很大,考虑缓存结果而不是语句。这肯定是一种可能性,但是希望能够改变在我的代码中执行该查询的任何位置,而调用一个函数返回PDORT语句,就像我刚才所说的‘$----*dB->查询($SQL)一样。但增加了缓存的性能优势。这样,查询后面的代码就不必更改,因为它将在PDO语句上运行,并且不知道差异。那么,这是否意味着每次获取并使用缓存语句时,查询仍会命中数据库?或者,数据库只会第一次被命中吗?@robapodica
locations
表有2792行14列,最终成为一个相当大的数据集。是的,这就是它被规范化的原因……哈哈,一个数组可能会成为我的解决方案。我当然会对这两个选项进行基准测试,看看哪个选项的性能最好,所以查询平均需要0.075微秒。当我将其转换为数组并缓存时,获取结果需要0.035微秒。不是很大的性能提升,哦,好吧。谢谢你的帮助!加载可能较大的阵列时,请注意内存限制问题。