Скорость загрузки сайта — это не только удобство для пользователей, но и ваши позиции в поиске. Если ваш проект на Yii2 работает медленно, кеширование страниц может стать тем самым ускорителем, который сэкономит нервы и ресурсы сервера. В этой статье разберём, как правильно настроить кеширование в Yii2, чтобы сайт летал.
Что такое кеширование страниц и зачем оно нужно
Представьте, что каждый раз, когда вы заходите на сайт, сервер заново собирает страницу: выполняет запросы к базе, рендерит шаблоны, подгружает данные. Это как готовить борщ с нуля каждый раз, когда захотелось есть. Кеширование — это когда вы один раз сварили борщ и потом просто разогреваете порцию. Быстро, вкусно и без лишних телодвижений.
В Yii2 есть несколько уровней кеширования: фрагменты, данные, страницы. Нас интересует именно кеширование целых страниц. Оно позволяет сохранить готовый HTML-код и отдавать его без запуска тяжёлых операций. Особенно полезно для страниц, которые редко меняются: главная, каталог, статьи.
Настройка компонента кеша
Прежде чем кешировать страницы, нужно настроить сам компонент кеша. В Yii2 по умолчанию используется файловый кеш, но для продакшена лучше взять что-то посерьёзнее, например, Memcached или Redis. Вот пример конфигурации в config/web.php:
'components' => [
'cache' => [
'class' => 'yii\caching\MemCache',
'servers' => [
[
'host' => 'localhost',
'port' => 11211,
'weight' => 100,
],
],
],
],
Если Memcached нет, можно использовать файловый кеш, но учтите: он медленнее. Для небольших проектов сойдёт и yii\caching\FileCache.
Кеширование целых страниц через фильтр PageCache
Самый простой способ — использовать фильтр PageCache. Он оборачивает действие контроллера и сохраняет результат в кеш. Подключается в методе behaviors() контроллера. Пример:
use yii\filters\PageCache;
public function behaviors()
{
return [
[
'class' => PageCache::class,
'only' => ['index', 'view'],
'duration' => 3600, // кеш на час
'dependency' => [
'class' => 'yii\caching\DbDependency',
'sql' => 'SELECT COUNT(*) FROM post',
],
],
];
}
Здесь мы говорим: кешируй действия index и view на 3600 секунд. А зависимость DbDependency проверяет, не изменилось ли количество постов в таблице. Если изменилось — кеш сбрасывается. Удобно, правда?
Тонкая настройка и параметры PageCache
У фильтра PageCache есть несколько параметров, которые стоит знать. Вот основные:
| Параметр | Описание | По умолчанию |
|---|---|---|
| duration | Время жизни кеша в секундах | 60 |
| dependency | Зависимость, которая инвалидирует кеш | null |
| variations | Вариации кеша (например, по языку) | [] |
| enabled | Включён ли кеш | true |
Параметр variations полезен, если контент зависит от языка или типа устройства. Например, можно кешировать отдельно для мобильных и десктопов.
Продвинутые техники: теги и фрагменты
Иногда нужно кешировать не всю страницу, а только её часть. Например, блок с последними комментариями. Для этого есть yii\filters\PageCache на уровне действий и виджет yii\widgets\FragmentCache или $this->beginCache() в представлении. Пример:
<?php if ($this->beginCache('post-list', ['duration' => 3600])): ?>
<?= $this->render('_posts', ['posts' => $posts]) ?>
<?php $this->endCache(); endif; ?>
Этот код закеширует часть страницы с списком постов на час. Если нужно сбросить кеш при изменении постов, используйте зависимости.
Ещё одна полезная штука — теги. С их помощью можно помечать кеш и потом сбрасывать по тегу. Например, при добавлении статьи сбрасывать кеш всех страниц с тегом «articles». В Yii2 это делается через TagDependency.
variations, чтобы кешировать каждую страницу отдельно. Иначе пользователи увидят одну и ту же страницу при переходе по страницам.
Типичные ошибки и как их избежать
Новички часто наступают на одни и те же грабли. Вот самые распространённые:
- Забывают про зависимости. Кеш живёт своей жизнью, данные меняются — пользователи видят старое. Всегда добавляйте
DbDependencyилиTagDependency. - Кешируют страницы с формами. Если на странице есть форма с CSRF-токеном, кеширование может сломать её. Исключайте такие страницы или используйте фрагментное кеширование.
- Не очищают кеш при деплое. После обновления кода старый кеш может содержать ошибки. Настройте сброс кеша в процессе деплоя.
Ещё одна ошибка — кеширование страниц для авторизованных пользователей. Если контент персонализирован, кеш нужно делать с вариациями по ID пользователя или вообще отключать для авторизованных.
Что в итоге
Кеширование страниц в Yii2 — это мощный инструмент, который может ускорить сайт в разы. Начните с простого: настройте компонент кеша и подключите PageCache к главной странице. Постепенно добавляйте зависимости и вариации. Следите за актуальностью данных и не забывайте сбрасывать кеш при изменениях. И помните: хороший кеш — это когда пользователи видят свежие данные, а сервер не надрывается от нагрузки.
Попробуйте применить эти советы на своём проекте — и вы удивитесь, насколько быстрее он станет.


