caching-fragment.md 11.2 KB
Newer Older
1
Кешування фрагментів
2
====================
3

4 5 6
Кешування фрагментів відноситься до кешування фрагментів веб-сторінки. Наприклад, якщо сторінка відображає в таблиці сумарні 
річні продажі, ви можете зберегти цю таблицю в кеші з метою економії часу, необхідного для створення таблиці при кожному запиті. 
Кешування фрагментів засноване на [кешуванні даних](caching-data.md).
7

8
Для кешування фрагментів використовуйте наступний код у [представленні](structure-views.md):
9 10 11 12

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

13
    // ... тут створюємо зміст ...
14 15 16 17 18

    $this->endCache();
}
```

19 20 21 22 23
Таким чином, розташуйте логіку генерації вмісту у комбінацію викликів [[yii\base\View::beginCache()|beginCache()]] та
[[yii\base\View::endCache()|endCache()]]. Якщо вміст буде знайдено у кеші, [[yii\base\View::beginCache()|beginCache()]]
відобразить закешований вміст і поверне false, оминаючи генерацію вмісту.
В іншому випадку, буде виконано логіку генерації вмісту і з викликом [[yii\base\View::endCache()|endCache()]]
згенерований вміст буде записаний до кешу.
24

25 26
Подібно до [кешування даних](caching-data.md), для кешування фрагментів необхідний унікальний ідентифікатор 
для визначення кешувального фрагмента.
27 28


29
## Параметри кешування <a name="caching-options"></a>
30

31 32 33
Ви можете вказати додаткові параметри про кешуванні фрагментів, передавши масив опцій в якості другого параметра метода
[[yii\base\View::beginCache()|beginCache()]]. За лаштунками, цей масив параметрів буде використано для налаштування віджета
[[yii\widgets\FragmentCache]], який реалізує фактичну функціональність кешування фрагментів.
34 35


36 37 38 39
### Тривалість <a name="duration"></a>

Мабуть найбільш часто використовуваною опцією кешування фрагмента є [[yii\widgets\FragmentCache::duration|duration]].
Вона визначає на скільки секунд зміст може залишатися дійсним у кеші. Код нижче кешує фрагмент не більше, ніж на одну:
40 41 42 43

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

44
    // ... тут створюємо зміст ...
45 46 47 48 49

    $this->endCache();
}
```

50
Якщо опцію тривалості не задано, то вона прийме значенне за замовчування (60), що означає, що вміст в кеші стане недійсним через 60 секунд.
51 52


53
### Залежності <a name="dependencies"></a>
54

55 56
Подібно до [кешування даних](caching-data.md#cache-dependencies), фрагмент вмісту у кеші також може мати залежності.
Наприклад, вміст поста, що відображається, залежить від того, чи був він змінений.
57

58 59 60
Для визначення залежності, встановіть опцію [[yii\widgets\FragmentCache::dependency|dependency]], 
яка може бути або обʼєктом [[yii\caching\Dependency]] або масивом налаштувань для створення обʼєкта залежностей.
Наступний код визначає, що вміст фрагмента залежить від зміни значення стовпця `updated_at`:
61 62 63 64 65 66 67 68 69

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

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

70
    // ... тут створюємо зміст ...
71 72 73 74 75 76

    $this->endCache();
}
```


77
### Варіації <a name="variations"></a>
78

79 80 81
Вміст, що кешується, може бути змінено відповідно до деяких параметрів.
Наприклад, для веб-додатка із підтримкою декількох мов, один і той же шматок представлення коду може генерувати контент на різних мовах.
Таким чином, ви можете змінювати кешований вміст відповідно до поточної мови додатка.
82

83 84 85
Щоб вказати варіації кешу, встановіть опцію [[yii\widgets\FragmentCache::variations|variations]], 
яка повинна бути масивом скалярних значень, кожне з яких представляє певний коефіцієнт варіації.
Наприклад, щоб кешувати вміст у залежності від мови додатка, ви можете використовувати наступний код:
86 87 88 89

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

90
    // ... тут створюємо зміст ...
91 92 93 94 95 96

    $this->endCache();
}
```


97
### Перемикання кешування <a name="toggling-caching"></a>
98

99 100 101 102
Іноді, ви можете захотіти увімкнути кешування фрагмента тільки за певних умов. Наприклад, для сторінки, яка відображає форму, 
ви хочете кешувати тільки форму при її початковому запиті (через GET-запит). Будь-яке подальше відображення (через POST-запит)
форми не повинне кешуватися, тому що форма може містити дані, що ввів користувач.
Щоб зробити це, ви можете встановити опцію [[yii\widgets\FragmentCache::enabled|enabled]] наступним чином:
103 104 105 106

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

107
    // ... тут створюємо зміст ...
108 109 110 111 112 113

    $this->endCache();
}
```


114
## Вкладене кешування <a name="nested-caching"></a>
115

116 117 118
Кешування фрагментів може бути вкладеним. Тобто, кешований фрагмент може бути укладений в інший фрагмент, що також кешується.
Наприклад, коментарі кешируются у внутрішньому фрагменті кешу, і вони ж кешуються разом із вмістом поста у зовнішньому 
фрагменті кеша. Наступний код показує, як два кеша фрагментів можуть бути вкладеними:
119 120 121 122

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

123
    // ...логіка створення контента...
124 125 126

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

127
        // ...логіка створення контента...
128 129 130 131

        $this->endCache();
    }

132
    // ...логіка створення контента...
133 134 135 136 137

    $this->endCache();
}
```

138 139 140 141 142
Для вкладених кешів можут бути встановлені різні опції кешування. Наприклад, внутрішні кеші і зовнішні кеші можуть використовувати
різні значення тривалості кеша. Навіть коли дані зовнішнього кеша вже є недійсними, внутрішній кеш все ще може містити актуальний фрагмент.
Тим не менш, це не є вірним у зворотньому напрямку. Якщо зовнішній кеш є дійсним, то він буде продовжувати віддавати кешовану копію,
навіть якщо внутрішній кеш є недійсним. Таким чином, ви повинні бути обережні у визначенні тривалості або залежностей вкладених кешей, 
в іншому випадку застарілі внутрішні фрагменти можуть зберігатися в зовнішньому фрагменті.
143 144


145
## Динамічний зміст <a name="dynamic-content"></a>
146

147 148 149 150 151
При використанні кешування фрагментів, ви можете зіткнутися із ситуацією, коли великий фрагмент змісту є відносно статичним,
за винятком одного або декількох місць. Наприклад, заголовок сторінки може відображатися у головному меню разом 
з імʼям поточного користувача. Інша проблема в тому, що закешований зміст може містити код PHP, який повинен 
виконуватися при кожному запиті (наприклад, код для реєстрації пакету ресурсів). Обидві ці проблеми можуть бути 
вирішені за допомогою так званої функції *динамічного змісту*.
152

153 154 155
Динамічний зміст означає фрагмент виведення, який не повинен кешуватися, навіть якщо він укладений у кешування фрагментів.
Для того, щоб зробити зміст динамічним постійно, він повинен бути створений за допомогою деякого PHP коду для кожного запиту,
навіть якщо зміст віддаєтся із кеша.
156

157 158
Ви можете викликати [[yii\base\View::renderDynamic()]] в кеші фрагмента для вставки динамічного контенту у потрібне місце,
як у прикладі нижче:
159 160 161 162

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

163
    // ...логіка створення контента...
164 165 166

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

167
    // ...логіка створення контента...
168 169 170 171 172

    $this->endCache();
}
```

173 174 175
Метод [[yii\base\View::renderDynamic()|renderDynamic()]] бере деяку частину коду PHP в якості параметра.
Значення, що повертається від коду PHP, трактується як динамічний зміст. Цей код PHP буде виконуватися при кожному запиті,
незалежно від того, чи віддається фрагмент із кешу або ні.