Конфигурация внешнего интерфейса кеша Zend - PullRequest
1 голос
/ 09 июня 2011
Zend_Cache can be configured to cache several types of output, including 
the results of function calls, the results of object and static method calls, 
entire pages, and configuration data.

Учитывая этот контроллер и связанные представления, как бы вы поступили с кэшированием? Из того, что некоторые из вас предложили здесь (см. @Marcin), я понял, что очистка всего кэша только для одного комментария илипост-обновление было бы слишком много. Как я должен идти, чтобы они кэшировались отдельно?

В основном у меня есть страница блога, где я загружаю все сообщения с комментариями соответствующих пользователей.

-индексный контроллер (домашняя страница):

class IndexController extends Zend_Controller_Action
{
  public function indexAction()
 {
  //Post is a db_table model
  $post_manager=new Post();
  $allPosts=$post_manager->getAllPosts();
  $this->view->posts=$allPosts;
 }

}

-index.phtml:

echo $this->partialLoop('_posts.phtml',$this->posts);

-_ posts.phtml:

echo $this->object->title;
echo $this->object->text;
echo $this->partialLoop('_comments.phtml',$this->object->getComments());

-_ comments.phtml:

echo $this->object->text;

Пожалуйста, опубликуйте практические примеры

еще раз спасибо

Ответы [ 2 ]

4 голосов
/ 09 июня 2011

Извините, я не переиграл ранее.Быстро, я хотел бы представить один способ поймать это на ваше рассмотрение.Для простоты я просто сконцентрируюсь на кэшировании ваших выходных данных с помощью внешнего интерфейса Output.

В вашем application.ini вы можете настроить свой отлов следующим образом:

resources.cachemanager.myviewcache.frontend.name = Output
resources.cachemanager.myviewcache.frontend.customFrontendNaming = false
resources.cachemanager.myviewcache.frontend.options.lifetime = 7200
resources.cachemanager.myviewcache.frontend.options.caching = true
resources.cachemanager.myviewcache.frontend.options.automatic_serialization = true
resources.cachemanager.myviewcache.backend.name = Apc

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

При этом я бы кешировал ваши посты и комментарии отдельно.Например, в _posts.phtml вы можете сделать что-то похожее на следующее:

// first cache an output related to the body of your post with key being associated
// with your post.
if (!($this->viewCache()->start('post_' . (string) $this->object->post_id))) {
  echo $this->object->title;
  echo $this->object->text;
}

// now I cache an output of a comments associated with a give post
if (!($this->viewCache()->start('post_comments_' . (string) $this->object->post_id))) {
  echo $this->partialLoop('_comments.phtml',$this->object->getComments());
}

В этом примере viewCache () помощник вида выглядит следующим образом:

class My_View_Helper_ViewCache extends Zend_View_Helper_Abstract {

    /**
     *
     * @return Zend_Cache_Frontend_Output 
     */
    public function viewCache() {
        return Zend_Registry::get('outputCache');
    }    
}

В то время как я установилoutputCache в реестр в Bootstrap.php:

protected function _initPutChachesIntoRegistry() {
    $this->bootstrap('cachemanager');
    $cacheManager = $this->getResource('cachemanager');

    Zend_Registry::set('outputCache', $cacheManager->getCache('myviewcache'));
}

Обратите внимание, что кэши связаны с ключами, которые, в свою очередь, относятся к данному сообщению и его комментариям.При этом, когда вы получаете новый комментарий, вы просто сбрасываете кеш, связанный с данным постом.Например, в действии вы можете удалить кэш комментариев для сообщения с $ post_id = 5 следующим образом:

$this->view->viewCache()->remove('post_comments_' . $post_id);

Надеюсь, что это поможет вам или, по крайней мере, даст вам некоторые идеи, как это сделать.

0 голосов
/ 09 июня 2011

Я не знаю, как сделать лучше, но вы можете сделать так:

Напишите плагин , который будет кеш-ответом контроллера с помощью postDispatch, и восстановите егоесли это в кеше используя preDispatch

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