Кэширование динамического содержимого

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

Для решения этой проблемы мы можем варьировать содержимое кэша в зависимости от имени пользователя, но это было бы очень большой тратой драгоценного места для кэширования практически одинакового содержимого, кроме имени пользователя. Мы также можем разделить страницу на несколько фрагментов и кэшировать их по отдельности, но это усложняет наше представление и делает код слишком сложным. Наилучший способ — использование возможности динамического содержимого, предоставляемой классом CController.

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

Мы вызываем метод CController::renderDynamic() для вставки динамического содержимого в нужное место.

…другое HTML-содержимое…
<?php if($this->beginCache($id)) { ?>
…фрагмент кэшируемого содержимого…
    <?php $this->renderDynamic($callback); ?>
…фрагмент кэшируемого содержимого…
<?php $this->endCache(); } ?>
…другое HTML-содержимое…

В коде выше $callback — это корректный обратный PHP-вызов. Это может быть строка с именем метода текущего контроллера или глобальной функции. Также это может быть массив, ссылающийся на метод класса. Любые дополнительные параметры в методе renderDynamic() должны быть переданы обратному вызову. Обратный вызов должен не отображать динамическое содержимое, а возвращать его.

Be the first person to leave a comment

Please to leave your comment.