19 октября 2011 г.

Zend cache manager + application.ini

Если кешей в приложении на зенде много (а так обычно и бывает, если у вас не хоум пейдж), рекомендую использовать их через специальный кеш менеджер, для которого существует соответствующий ресурс приложения.
В принципе, пример не сильно отличается от оф доки, разве что Вы также нарвались на упоминания в оной неких статический методов класса Zend_Cache_Manager, которых давно уже нет в коде =)

Настраиваем соответствующий ресурс на поддержку двух кешей:

Copy Source | Copy HTML
  1. ;long cache

  2. resources.cachemanager.long.frontend.name = Core

  3. resources.cachemanager.long.frontend.options.lifetime = 86400

  4. resources.cachemanager.long.frontend.options.automatic_serialization = true

  5. resources.cachemanager.long.frontend.options.cache_id_prefix = dseyeLong_

  6. resources.cachemanager.long.frontend.options.ignore_user_abort = true

  7. resources.cachemanager.long.backend.name = Memcached

  8. resources.cachemanager.long.backend.options.server.one.host = 127.0.0.1

  9. resources.cachemanager.long.backend.options.server.one.port = 11211

  10. resources.cachemanager.long.frontendBackendAutoload = false

  11.  

  12. ;up cache

  13. resources.cachemanager.up.frontend.name = Core

  14. resources.cachemanager.up.frontend.options.automatic_serialization = true

  15. resources.cachemanager.up.frontend.options.cache_id_prefix = dseyeUP_

  16. resources.cachemanager.up.frontend.options.ignore_user_abort = true

  17. resources.cachemanager.up.backend.name = Memcached

  18. resources.cachemanager.up.backend.options.server.one.host = 127.0.0.1

  19. resources.cachemanager.up.backend.options.server.one.port = 11211

  20. resources.cachemanager.up.frontendBackendAutoload = false

Использование в бутстрапе (в данном случае для кеширования метаданных):

Copy Source | Copy HTML
  1. protected function _initCaches()

  2. {

  3.     $this->bootstrap('cachemanager');

  4.     $manager = $this->getResource('cachemanager');

  5.  

  6.     //кеш метаданных

  7.     Zend_Db_Table_Abstract::setDefaultMetadataCache( $manager->getCache('long') );

  8.  

  9.     //время кеширования для кеша обновляемой рывками инфы 

  10.     $manager->getCache('up')->setLifetime($time);

  11. }


Обратите внимание - у кеша по имени up не задано время жизни в application.ini (в этом случае оно будет по умолчанию равно 3600 секундам). Это сделано для того, чтобы установить своё значение, рассчитанное каким либо образом. В примере это переменная $time.

Использование через frontcontroller:

Copy Source | Copy HTML
  1. Zend_Controller_Front::getInstance()

  2.    ->getParam('bootstrap')

  3.    ->getResource('cachemanager')

  4.    ->getCache('long');

Использование через action helper:

Copy Source | Copy HTML
  1. $this->_helper->getHelper('cache')

  2.    ->getManager()

  3.    ->getCache('long')



2 комментария:

Владимир комментирует...

Хорошая статья.

Но есть один вопрос, а что по поводу использования cachemanager-а в моделях.

Допустим через
Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('cachemanager')->getCache('long');

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

Спасибо.

esemi комментирует...

Хороший вопрос =)

На самом деле в полный рост с данной проблемой я не сталкивался, но вообще она относится к реализации зависимостей между классами, принятой в вашем проекте.

В большинстве случаев, в версиях зенда 1.*, я решаю это передачей экземпляра кеша в модель при инициализации последней.
Тобишь нечто вроде следующего кода:
$cache = $this->_helper->getHelper('cache')->getManager()->getCache('long');
$model = new Model($cache);
Таким образом зависимость модели от кеша становится более явной. Мне этого пока хватало.
Если дело касается неких самописных моделей, то как правило я заранее предусматриваю метод setCache().

Более строгая и лучшая реализация DI сделана в версиях зенда 2.* - там без этого прямо как без рук =)