Spec-Zone.ru › Yii 2.0

Кэширование фрагментов

  1. Параметры кэширования
  2. Вложенное кэширование
  3. Динамическое содержимое

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

Для использования кэширования фрагментов используйте следующий фрагмент кода во представлении:

if ($this->beginCache($id)) {

    // ... generate content here ...

    $this->endCache();
}

То есть, заключите логику генерации содержимого в пару вызовов beginCache() и endCache(). Если содержимое найдено в кэше, beginCache() отобразит кэшированное содержимое и вернёт false, тем самым пропуская логику генерации содержимого. В противном случае, ваша логика генерации содержимого будет вызвана, а при вызове endCache() сгенерированное содержимое будет захвачено и сохранено в кэше.

Как и при кэшировании данных, для идентификации кэшированного содержимого необходим уникальный $id.

Параметры кэширования

Вы можете указать дополнительные параметры кэширования фрагментов, передав массив параметров в качестве второго параметра методу beginCache(). За кулисами этот массив параметров будет использован для конфигурации виджета yii\widgets\FragmentCache, который реализует функциональность кэширования фрагментов.

Срок действия

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

if ($this->beginCache($id, ['duration' => 3600])) {

    // ... generate content here ...

    $this->endCache();
}

Если параметр не задан, он примет значение по умолчанию 60, что означает, что кэшированное содержимое истечёт через 60 секунд.

Зависимости

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

Для указания зависимости установите параметр dependency, который может быть объектом yii\caching\Dependency или массивом конфигурации для создания объекта зависимости. Следующий код указывает, что содержимое фрагмента зависит от изменения значения столбца updated_at:

$dependency = [
    'class' => 'yii\caching\DbDependency',
    'sql' => 'SELECT MAX(updated_at) FROM post',
];

if ($this->beginCache($id, ['dependency' => $dependency])) {

    // ... generate content here ...

    $this->endCache();
}

Варианты

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

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

if ($this->beginCache($id, ['variations' => [Yii::$app->language]])) {

    // ... generate content here ...

    $this->endCache();
}

Включение/выключение кэширования

Иногда вы можете захотеть включить кэширование фрагментов только при выполнении определённых условий. Например, для страницы, отображающей форму, вы хотите кэшировать форму только при её первоначальном запросе (через GET-запрос). Любое последующее отображение (через POST-запрос) формы не должно кэшироваться, так как форма может содержать данные пользователя. Для этого вы можете установить параметр enabled, как показано ниже:

if ($this->beginCache($id, ['enabled' => Yii::$app->request->isGet])) {

    // ... generate content here ...

    $this->endCache();
}

Вложенное кэширование

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

if ($this->beginCache($id1)) {

    // ...content generation logic...

    if ($this->beginCache($id2, $options2)) {

        // ...content generation logic...

        $this->endCache();
    }

    // ...content generation logic...

    $this->endCache();
}

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

Динамическое содержимое

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

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

Вы можете вызвать yii\base\View::renderDynamic() внутри кэшированного фрагмента, чтобы вставить динамическое содержимое в нужное место, как показано ниже,

if ($this->beginCache($id1)) {

    // ...content generation logic...

    echo $this->renderDynamic('return Yii::$app->user->identity->name;');

    // ...content generation logic...

    $this->endCache();
}

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

© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc-2.0/guide-caching-fragment.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API