Zend Framework Paginator缓存不起作用(没有命中)

时间:2011-09-20 20:54:41

标签: php zend-framework caching

我使用基于文件的缓存来缓存分页器:

$table = $this->getDbTable();

$ret = $table   ->select()
        ->from($table,array('id',
                            'UNIX_TIMESTAMP(`date`) as date',
                            'categoryId',
                            'title',
                            'teaser'))
        ->where('`categoryId`=?',$cat)
        ->order('date desc');

$adapter = new Zend_Paginator_Adapter_DbTableSelect($ret);
$paginator = new Zend_Paginator($adapter);

$fO = array('lifetime' => 3600, 'automatic_serialization' => true);
$bO = array('cache_dir'=>APPLICATION_PATH . '/cache');
$cache = Zend_cache::factory('Core', 'File', $fO, $bO);
Zend_Paginator::setCache($cache);

$paginator->setItemCountPerPage(5);
$paginator->setCurrentPageNumber($page);

$this->view->paginator = $paginator;

现在每个请求,paginator都会创建一个neew缓存条目并忽略创建的旧条目?有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我在 Zend_Paginator 方面遇到了类似的问题。这些问题只有 Zend_Paginator_Adapter_DbTableSelect (我对 Zend_Paginator_Adapter_Array 没有问题)。

缓存文件名zend_cache---Zend_Paginator_3_ 2b49905a9282f742e1cefafc53892794 的粗体部分由 _getCacheId 函数(检查 Zend_Paginator )根据适配器生成传递给构造函数。在每个请求中,分页器都会创建一个新代码,因为适配器在$_cache->load时刻和$_cache->save时刻永远不会相同。

将数据保存到缓存中时用作文件名的适配器的md5序列化值与从缓存中读取数据时使用的值不同(如果启用了DB事件探查器)。您不得使用数据库分析器才能使 Zend_Paginator 缓存起作用(仅在开发阶段使用它)。

我找到的另一个失败原因取决于这两行代码:

$offset = ($pageNumber - 1) * $this->getItemCountPerPage();
$items = $this->_adapter->getItems($offset, $this->getItemCountPerPage());

$_cache->load$_cache->save之间调用它们,并为适配器添加限制值和 limitoffset 值。调用$_cache->load时不会设置此值,因此在这种情况下,基于适配器的md5序列化值的文件名也会有所不同。

必须将它们放在$_cache->load之前。您可以创建一个扩展 Zend_Paginator 的paginator类,并修改 getItemsByPage 函数。在$pageNumber = $this->normalizePageNumber($pageNumber)之后的开始处添加两行。

这对我有用。我希望它也会帮助别人。