4 июля 2011 г.

Zend_Paginator + Cache (memcached)

Столкнулся с проблемой при попытке прикрутить нативное кеширование к пагинатору (DbTableSelect адаптер)

бутстрап (производим кеш и скармливаем пагинатору)

Copy Source | Copy HTML
  1. $backendOptions = array(
  2.             'servers' => array( array(
  3.                     'host' => '127.0.0.1',
  4.                     'port' => (APPLICATION_ENV == 'production') ? 12245 : 11211,
  5.                     'persistent' => true,
  6.                     'weight' => 1,
  7.                     'timeout' => 10,
  8.                     'retry_interval' => 15,
  9.                     'status' => true,
  10.                     'failure_callback' => null ) ) );
  11.  
  12.         $frontendOptions = array(
  13.             'lifetime' => 3600
  14.             'automatic_serialization' => true,
  15.             'caching' => (APPLICATION_ENV == 'production') ? true : true,
  16.             'cache_id_prefix' => 'dseyeUP_',
  17.             'ignore_user_abort' => true );
  18.  
  19.         $cache = Zend_Cache::factory(
  20.                         'Core',
  21.                         'Memcached',
  22.                         $frontendOptions,
  23.                         $backendOptions);
  24.         Zend_Registry::set('upCoreMem', $cache);
  25.  
  26.         Zend_Paginator::setCache($cache);
  27.  

контроллер

Copy Source | Copy HTML
  1. $count = $this->_worlds->getPlayersCount($this->idW);
  2. $this->view->paginator = $paginator = $this->_players->listWorldPlayers($this->idW, $page, $count);


По всем мануалам всё должно работать, но нет:
во первых ZFDebug показывает лишний коннект к БД перед запросом данных пагинатора
во вторых этот запрос не кешируется никогда

Долго гуглил и копал сорцы, но как то безуспешно =(

Нашёл пару багов, где у людей файловый кеш пагинатора не работал при включенном профилировании через фаербаг, но показалось что проблема не та.

Версия 1.11.0, но и на продакшене 1.11.3 тоже самое.

Сам кеш разумеется работает нормально, без проблем подцепился к метаданным DbTable, да и ручками много где используется =)

Как временно решение прикрутил ручками кеширование этого запроса по составному ключу из параметров.

Комментариев нет: