В принципе, пример не сильно отличается от оф доки, разве что Вы также нарвались на упоминания в оной неких статический методов класса Zend_Cache_Manager, которых давно уже нет в коде =)
Настраиваем соответствующий ресурс на поддержку двух кешей:
Copy Source | Copy HTML
- ;long cache
- resources.cachemanager.long.frontend.name = Core
- resources.cachemanager.long.frontend.options.lifetime = 86400
- resources.cachemanager.long.frontend.options.automatic_serialization = true
- resources.cachemanager.long.frontend.options.cache_id_prefix = dseyeLong_
- resources.cachemanager.long.frontend.options.ignore_user_abort = true
- resources.cachemanager.long.backend.name = Memcached
- resources.cachemanager.long.backend.options.server.one.host = 127.0.0.1
- resources.cachemanager.long.backend.options.server.one.port = 11211
- resources.cachemanager.long.frontendBackendAutoload = false
-
- ;up cache
- resources.cachemanager.up.frontend.name = Core
- resources.cachemanager.up.frontend.options.automatic_serialization = true
- resources.cachemanager.up.frontend.options.cache_id_prefix = dseyeUP_
- resources.cachemanager.up.frontend.options.ignore_user_abort = true
- resources.cachemanager.up.backend.name = Memcached
- resources.cachemanager.up.backend.options.server.one.host = 127.0.0.1
- resources.cachemanager.up.backend.options.server.one.port = 11211
- resources.cachemanager.up.frontendBackendAutoload = false
Использование в бутстрапе (в данном случае для кеширования метаданных):
Copy Source | Copy HTML
- protected function _initCaches()
- {
- $this->bootstrap('cachemanager');
- $manager = $this->getResource('cachemanager');
-
- //кеш метаданных
- Zend_Db_Table_Abstract::setDefaultMetadataCache( $manager->getCache('long') );
-
- //время кеширования для кеша обновляемой рывками инфы
- $manager->getCache('up')->setLifetime($time);
- }
Обратите внимание - у кеша по имени up не задано время жизни в application.ini (в этом случае оно будет по умолчанию равно 3600 секундам). Это сделано для того, чтобы установить своё значение, рассчитанное каким либо образом. В примере это переменная $time.
Использование через frontcontroller:
Copy Source | Copy HTML
- Zend_Controller_Front::getInstance()
- ->getParam('bootstrap')
- ->getResource('cachemanager')
- ->getCache('long');
Использование через action helper:
Copy Source | Copy HTML
- $this->_helper->getHelper('cache')
- ->getManager()
- ->getCache('long')
2 комментария:
Хорошая статья.
Но есть один вопрос, а что по поводу использования cachemanager-а в моделях.
Допустим через
Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('cachemanager')->getCache('long');
не есть гуд, так как это неправильно юзать фронтконтроллер там где ему не место, получается через Zend_Registry, что тоже не очень, может вы знаете лучший способ.
Спасибо.
Хороший вопрос =)
На самом деле в полный рост с данной проблемой я не сталкивался, но вообще она относится к реализации зависимостей между классами, принятой в вашем проекте.
В большинстве случаев, в версиях зенда 1.*, я решаю это передачей экземпляра кеша в модель при инициализации последней.
Тобишь нечто вроде следующего кода:
$cache = $this->_helper->getHelper('cache')->getManager()->getCache('long');
$model = new Model($cache);
Таким образом зависимость модели от кеша становится более явной. Мне этого пока хватало.
Если дело касается неких самописных моделей, то как правило я заранее предусматриваю метод setCache().
Более строгая и лучшая реализация DI сделана в версиях зенда 2.* - там без этого прямо как без рук =)
Отправить комментарий