我使用基于文件的缓存来缓存分页器:
$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缓存条目并忽略创建的旧条目?有什么想法吗?
答案 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)
之后的开始处添加两行。
这对我有用。我希望它也会帮助别人。