Скорость загрузки сайта — это не только удобство для пользователей, но и ваши позиции в поиске. Если ваш проект на Yii2 работает медленно, кеширование страниц может стать тем самым ускорителем, который сэкономит нервы и ресурсы сервера. В этой статье разберём, как правильно настроить кеширование в Yii2, чтобы сайт летал.

Digital-студия WNDER

Что такое кеширование страниц и зачем оно нужно

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

В 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 к главной странице. Постепенно добавляйте зависимости и вариации. Следите за актуальностью данных и не забывайте сбрасывать кеш при изменениях. И помните: хороший кеш — это когда пользователи видят свежие данные, а сервер не надрывается от нагрузки.

Попробуйте применить эти советы на своём проекте — и вы удивитесь, насколько быстрее он станет.

Студия WNDER