Кэш Zend Framework Paginator не работает (без попадания) - PullRequest
2 голосов
/ 21 сентября 2011

Я использую файловый кеш для кэширования страниц:

$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 создает новую запись в кэше и игнорирует созданную старую? Есть идеи?

1 Ответ

0 голосов
/ 05 сентября 2012

У меня были похожие проблемы с Zend_Paginator .Эти проблемы возникают только с Zend_Paginator_Adapter_DbTableSelect (у меня не было проблем с Zend_Paginator_Adapter_Array ).

Жирная часть имени файла кэша zend_cache---Zend_Paginator_3_ 2b49905a9282f742e1cefafc53892794 выполнена с помощью функции _getCacheId (проверка Zend_Paginator ) на основе адаптера, переданного вконструкторПри каждом запросе paginator создает новый код, потому что адаптер никогда не совпадает в момент $_cache->load и $_cache->save.

Серийное значение md5 адаптера, используемого в качестве имени файла при сохранении данных вКеш отличается от того, который используется при чтении данных из кеша, если у вас включен профилировщик БД.Вы не должны использовать профилировщик БД для того, чтобы кэш Zend_Paginator работал (используйте его только на этапе разработки).

Другая найденная мной причина сбоя определяется этими двумя строками кода:

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

Они вызываются между $_cache->load и $_cache->save, и они добавляют значение limitcount и значение limitoffset для адаптера.Эти значения не устанавливаются при вызове $_cache->load, поэтому имя файла на основе сериализованного значения md5 адаптера в этом случае также будет другим.

Они должны быть помещены до $_cache->load.Вы можете создать класс paginator, который расширяет Zend_Paginator и модифицирует getItemsByPage .Добавьте две строки в начале, после $pageNumber = $this->normalizePageNumber($pageNumber).

Это сработало для меня.Я надеюсь, что это поможет и другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...