mirror of
https://github.com/yiisoft/yii2.git
synced 2025-08-14 14:28:27 +08:00
176 lines
11 KiB
Markdown
176 lines
11 KiB
Markdown
Кешування фрагментів
|
||
====================
|
||
|
||
Кешування фрагментів відноситься до кешування фрагментів веб-сторінки. Наприклад, якщо сторінка відображає в таблиці сумарні
|
||
річні продажі, ви можете зберегти цю таблицю в кеші з метою економії часу, необхідного для створення таблиці при кожному запиті.
|
||
Кешування фрагментів засноване на [кешуванні даних](caching-data.md).
|
||
|
||
Для кешування фрагментів використовуйте наступний код у [представленні](structure-views.md):
|
||
|
||
```php
|
||
if ($this->beginCache($id)) {
|
||
|
||
// ... тут створюємо вміст ...
|
||
|
||
$this->endCache();
|
||
}
|
||
```
|
||
|
||
Таким чином, розташуйте логіку генерування вмісту у комбінацію викликів [[yii\base\View::beginCache()|beginCache()]] та
|
||
[[yii\base\View::endCache()|endCache()]]. Якщо вміст буде знайдено у кеші, [[yii\base\View::beginCache()|beginCache()]]
|
||
відобразить закешований вміст і поверне `false`, оминаючи генерування вмісту.
|
||
В іншому випадку, буде виконано логіку генерування вмісту і з викликом [[yii\base\View::endCache()|endCache()]]
|
||
згенерований вміст буде записаний до кешу.
|
||
|
||
Подібно до [кешування даних](caching-data.md), для кешування фрагментів необхідний унікальний ідентифікатор
|
||
для визначення кешувального фрагмента.
|
||
|
||
|
||
## Параметри кешування <span id="caching-options"></span>
|
||
|
||
Ви можете вказати додаткові параметри про кешуванні фрагментів, передавши масив опцій в якості другого параметра метода
|
||
[[yii\base\View::beginCache()|beginCache()]]. За лаштунками, цей масив параметрів буде використано для налаштування віджета
|
||
[[yii\widgets\FragmentCache]], який реалізує фактичну функціональність кешування фрагментів.
|
||
|
||
|
||
### Тривалість <span id="duration"></span>
|
||
|
||
Мабуть найбільш часто використовуваною опцією кешування фрагмента є [[yii\widgets\FragmentCache::duration|duration]].
|
||
Вона визначає на скільки секунд вміст може залишатися дійсним у кеші. Код нижче кешує фрагмент не більше, ніж на одну:
|
||
|
||
```php
|
||
if ($this->beginCache($id, ['duration' => 3600])) {
|
||
|
||
// ... тут створюємо вміст ...
|
||
|
||
$this->endCache();
|
||
}
|
||
```
|
||
|
||
Якщо опцію тривалості не задано, то вона прийме значенне за замовчування (60), що означає, що вміст в кеші стане недійсним через 60 секунд.
|
||
|
||
|
||
### Залежності <span id="dependencies"></span>
|
||
|
||
Подібно до [кешування даних](caching-data.md#cache-dependencies), фрагмент вмісту у кеші також може мати залежності.
|
||
Наприклад, вміст поста, що відображається, залежить від того, чи був він змінений.
|
||
|
||
Для визначення залежності, встановіть опцію [[yii\widgets\FragmentCache::dependency|dependency]],
|
||
яка може бути або обʼєктом [[yii\caching\Dependency]] або масивом налаштувань для створення обʼєкта залежностей.
|
||
Наступний код визначає, що вміст фрагмента залежить від зміни значення стовпця `updated_at`:
|
||
|
||
```php
|
||
$dependency = [
|
||
'class' => 'yii\caching\DbDependency',
|
||
'sql' => 'SELECT MAX(updated_at) FROM post',
|
||
];
|
||
|
||
if ($this->beginCache($id, ['dependency' => $dependency])) {
|
||
|
||
// ... тут створюємо вміст ...
|
||
|
||
$this->endCache();
|
||
}
|
||
```
|
||
|
||
|
||
### Варіації <span id="variations"></span>
|
||
|
||
Вміст, що кешується, може бути змінено відповідно до деяких параметрів.
|
||
Наприклад, для веб-додатка із підтримкою декількох мов, один і той же шматок представлення коду може генерувати контент на різних мовах.
|
||
Таким чином, ви можете змінювати кешований вміст відповідно до поточної мови додатка.
|
||
|
||
Щоб вказати варіації кешу, встановіть опцію [[yii\widgets\FragmentCache::variations|variations]],
|
||
яка повинна бути масивом скалярних значень, кожне з яких представляє певний коефіцієнт варіації.
|
||
Наприклад, щоб кешувати вміст у залежності від мови додатка, ви можете використовувати наступний код:
|
||
|
||
```php
|
||
if ($this->beginCache($id, ['variations' => [Yii::$app->language]])) {
|
||
|
||
// ... тут створюємо вміст ...
|
||
|
||
$this->endCache();
|
||
}
|
||
```
|
||
|
||
|
||
### Перемикання кешування <span id="toggling-caching"></span>
|
||
|
||
Іноді, ви можете захотіти увімкнути кешування фрагмента тільки за певних умов. Наприклад, для сторінки, яка відображає форму,
|
||
ви хочете кешувати тільки форму при її початковому запиті (через GET-запит). Будь-яке подальше відображення (через POST-запит)
|
||
форми не повинне кешуватися, тому що форма може містити дані, що ввів користувач.
|
||
Щоб зробити це, ви можете встановити опцію [[yii\widgets\FragmentCache::enabled|enabled]] наступним чином:
|
||
|
||
```php
|
||
if ($this->beginCache($id, ['enabled' => Yii::$app->request->isGet])) {
|
||
|
||
// ... тут створюємо вміст ...
|
||
|
||
$this->endCache();
|
||
}
|
||
```
|
||
|
||
|
||
## Вкладене кешування <span id="nested-caching"></span>
|
||
|
||
Кешування фрагментів може бути вкладеним. Тобто, кешований фрагмент може бути укладений в інший фрагмент, що також кешується.
|
||
Наприклад, коментарі кешируются у внутрішньому фрагменті кешу, і вони ж кешуються разом із вмістом поста у зовнішньому
|
||
фрагменті кеша. Наступний код показує, як два кеша фрагментів можуть бути вкладеними:
|
||
|
||
```php
|
||
if ($this->beginCache($id1)) {
|
||
|
||
// ...логіка створення контента...
|
||
|
||
if ($this->beginCache($id2, $options2)) {
|
||
|
||
// ...логіка створення контента...
|
||
|
||
$this->endCache();
|
||
}
|
||
|
||
// ...логіка створення контента...
|
||
|
||
$this->endCache();
|
||
}
|
||
```
|
||
|
||
Для вкладених кешів можут бути встановлені різні опції кешування. Наприклад, внутрішні кеші і зовнішні кеші можуть використовувати
|
||
різні значення тривалості кеша. Навіть коли дані зовнішнього кеша вже є недійсними, внутрішній кеш все ще може містити актуальний фрагмент.
|
||
Тим не менш, це не є вірним у зворотньому напрямку. Якщо зовнішній кеш є дійсним, то він буде продовжувати віддавати кешовану копію,
|
||
навіть якщо внутрішній кеш є недійсним. Таким чином, ви повинні бути обережні у визначенні тривалості або залежностей вкладених кешей,
|
||
в іншому випадку застарілі внутрішні фрагменти можуть зберігатися в зовнішньому фрагменті.
|
||
|
||
|
||
## Динамічний вміст <span id="dynamic-content"></span>
|
||
|
||
При використанні кешування фрагментів, ви можете зіткнутися із ситуацією, коли великий фрагмент вмісту є відносно статичним,
|
||
за винятком одного або декількох місць. Наприклад, заголовок сторінки може відображатися у головному меню разом
|
||
з імʼям поточного користувача. Інша проблема в тому, що закешований вміст може містити код PHP, який повинен
|
||
виконуватися при кожному запиті (наприклад, код для реєстрації колекції ресурсів). Обидві ці проблеми можуть бути
|
||
вирішені за допомогою так званої функції *динамічного вмісту*.
|
||
|
||
Динамічний вміст означає фрагмент виведення, який не повинен кешуватися, навіть якщо він укладений у кешування фрагментів.
|
||
Для того, щоб зробити вміст динамічним постійно, він повинен бути створений за допомогою деякого коду PHP для кожного запиту,
|
||
навіть якщо вміст віддаєтся із кеша.
|
||
|
||
Ви можете викликати [[yii\base\View::renderDynamic()]] в кеші фрагмента для вставки динамічного контенту у потрібне місце,
|
||
як у прикладі нижче:
|
||
|
||
```php
|
||
if ($this->beginCache($id1)) {
|
||
|
||
// ...логіка створення контента...
|
||
|
||
echo $this->renderDynamic('return Yii::$app->user->identity->name;');
|
||
|
||
// ...логіка створення контента...
|
||
|
||
$this->endCache();
|
||
}
|
||
```
|
||
|
||
Метод [[yii\base\View::renderDynamic()|renderDynamic()]] бере деяку частину коду PHP в якості параметра.
|
||
Значення, що повертається від коду PHP, трактується як динамічний вміст. Цей код PHP буде виконуватися при кожному запиті,
|
||
незалежно від того, чи віддається фрагмент із кешу або ні.
|