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

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

Кеширование — это сохранение данных, которые редко меняются, в быстром хранилище. Вместо того чтобы каждый раз лезть в базу данных или выполнять сложные вычисления, Yii2 берёт готовый результат из кеша. Это снижает нагрузку на сервер и ускоряет ответ пользователю. В Yii2 есть встроенные компоненты для кеширования: файловое, memcached, redis, APC и другие. Ты можешь выбрать то, что подходит под твой проект.

Пример из жизни: если у тебя на сайте список городов в выпадающем меню, он не меняется каждый день. Зачем каждый раз делать SQL-запрос? Сохрани его в кеш на час — и всё.

Правило: Кешируй только то, что редко меняется. Если данные обновляются каждую секунду, кеш только навредит.

Основные виды кеша в Yii2

Yii2 поддерживает несколько типов кеширования. Вот самые популярные из них:

Тип кешаОписаниеКогда использовать
File CacheХранит данные в файлах на сервереДля небольших проектов, когда нет доступа к другим хранилищам
MemCacheИспользует оперативную память (через Memcached)Для средних и крупных проектов, где важна скорость
Redis CacheХранит данные в Redis (NoSQL база данных в памяти)Для высоконагруженных проектов с распределённой архитектурой
APC CacheИспользует кеширование на уровне PHP (APCu)Для ускорения опкода и небольших данных
Database CacheХранит данные в таблице базы данныхКогда нужно централизованное хранение кеша для нескольких серверов

Чтобы настроить кеш, достаточно добавить компонент в конфигурацию приложения. Например, для файлового кеша:

'components' => [
    'cache' => [
        'class' => 'yii\caching\FileCache',
    ],
],

После этого ты можешь использовать кеш через Yii::$app->cache в любом месте приложения.

Как работать с кешем: простые примеры

Yii2 предоставляет удобные методы для работы с кешем. Вот основные из них:

  • set() — сохранить значение в кеш. Пример: Yii::$app->cache->set('key', $data, 3600); (на час).
  • get() — получить значение из кеша. Если ключа нет, вернёт false.
  • delete() — удалить конкретный ключ.
  • flush() — очистить весь кеш (осторожно, удаляет всё).

Пример с кешированием сложного запроса к базе:

$cache = Yii::$app->cache;
$users = $cache->get('users_list');

if ($users === false) {
    // Данных нет в кеше, делаем запрос
    $users = User::find()->where(['active' => 1])->all();
    // Сохраняем на 10 минут (600 секунд)
    $cache->set('users_list', $users, 600);
}

// Теперь $users содержит данные из кеша или из БД
foreach ($users as $user) {
    echo $user->name;
}

Обрати внимание: если данные изменились (например, добавился новый пользователь), нужно вручную сбросить кеш. Для этого вызывай Yii::$app->cache->delete('users_list'); после операции обновления.

Лайфхак: Используй зависимости кеша. Например, если данные зависят от времени последнего обновления записи, можно привязать кеш к этой дате. Yii2 поддерживает зависимости через класс yii\caching\Dependency.

Кеширование фрагментов и страниц целиком

В Yii2 можно кешировать не только данные, но и части HTML-кода (фрагменты) или целые страницы. Это делается через виджеты или фильтры.

Кеширование фрагментов — полезно для блоков, которые не меняются часто, например, меню или подвал. Используй виджет yii\widgets\FragmentCache:

<?php
use yii\widgets\FragmentCache;
?>

<?php FragmentCache::begin(['id' => 'menu', 'duration' => 3600]) ?>
    <!-- Здесь HTML меню, который будет закеширован на час -->
    <ul>
        <li><a href="/about">О нас</a></li>
        <li><a href="/contact">Контакты</a></li>
    </ul>
<?php FragmentCache::end() ?>

Кеширование страниц целиком — для статичных страниц, которые редко обновляются. Подключается через поведение в контроллере:

use yii\filters\PageCache;

public function behaviors()
{
    return [
        [
            'class' => PageCache::class,
            'only' => ['index'],
            'duration' => 600,
        ],
    ];
}

Этот код закеширует страницу index на 10 минут. Если пользователь зайдёт снова, он получит готовый HTML, без вызова контроллера.

Советы по выбору хранилища для кеша

Не все хранилища одинаково полезны. Вот мои рекомендации:

  • Для локальной разработки — используй файловый кеш. Он простой и не требует дополнительных сервисов.
  • Для продакшена с одним сервером — MemCache или Redis через Unix-сокет. Это даст прирост скорости.
  • Для кластера из нескольких серверов — Redis с репликацией или Database Cache (если данные должны быть синхронизированы).
  • Избегай APC для больших объёмов данных — он ограничен по памяти и не подходит для длительного хранения.

Настройка Redis в Yii2:

'components' => [
    'cache' => [
        'class' => 'yii\redis\Cache',
        'redis' => [
            'hostname' => 'localhost',
            'port' => 6379,
            'database' => 0,
        ],
    ],
],

Не забудь установить расширение yii2-redis через Composer.

Правило: Всегда устанавливай время жизни кеша (TTL). Бесконечный кеш — это путь к устаревшим данным.

Что в итоге

Кеширование в Yii2 — это мощный инструмент, который может ускорить твой сайт в несколько раз. Начни с малого: закешируй самые тяжёлые запросы к базе или статичные блоки HTML. Выбери подходящее хранилище — файлы, MemCache или Redis. И не забывай про зависимости и TTL, чтобы данные не устаревали. Если сделаешь всё правильно, сайт будет работать быстро, а пользователи скажут спасибо.

Студия WNDER