На 10-ом уроке мы изучим одну из тем для оптимизации ваших приложений, это кеширование в Yii 2. Если вы хотите, чтобы ваш сайт работал быстро даже при большой нагрузке, этот урок станет вашим надежным помощником. Мы разберем типы кеширования, научимся кешировать запросы к базе данных, работать с фрагментным кешированием в представлениях и правильно очищать кеш.
Типы кеширования в Yii 2
Кеширование это сохранение часто используемых данных в быстродоступном хранилище, чтобы сократить время их получения. В Yii 2 поддерживается несколько типов кеширования и выбор зависит от ваших задач и инфраструктуры.
Файловое кеширование
Самый простой способ, это сохранять данные в файлы. Это удобно для небольших проектов или локальной разработки. Yii 2 использует класс FileCache, который хранит кеш в директории @runtime/cache.
Настройка файлового кеша:
Добавьте компонент в конфигурационный файл config/web.php:
'components' => [ 'cache' => [ 'class' => 'yii\caching\FileCache', // Дополнительные настройки, например: 'cachePath' => '@app/runtime/cache', ], ],
Пример использования:
// Сохраняем данные в кеш на 60 секунд Yii::$app->cache->set('my_key', 'Данные для кеша', 60); // Получаем данные $data = Yii::$app->cache->get('my_key'); if ($data === false) { // Если данных нет в кеше, генерируем их заново $data = 'Новые данные'; Yii::$app->cache->set('my_key', $data, 60); }
Плюсы:
- Простота настройки.
- Не требует дополнительных сервисов.
Минусы:
- Низкая производительность на высоких нагрузках.
- Не подходит для распределенных систем.
Redis
Redis это высокопроизводительное хранилище данных в памяти. Оно идеально подходит для кеширования в масштабируемых приложениях.
Настройка Redis в Yii 2:
- Установите расширение PHP для Redis:
pecl install redis - Добавьте компонент в конфигурацию:
'components' => [ 'cache' => [ 'class' => 'yii\redis\Cache', 'redis' => [ 'hostname' => 'localhost', 'port' => 6379, 'database' => 0, ], ], ],
Пример использования:
// Аналогично FileCache Yii::$app->cache->set('user_42', $userData, 3600); $userData = Yii::$app->cache->get('user_42');
Плюсы:
- Высокая скорость.
- Поддержка сложных структур данных (хеши, списки).
Минусы:
- Требует установки Redis на сервер.
Memcached
Memcached еще одно популярное хранилище в памяти. Оно отлично справляется с распределенным кешированием.
Настройка Memcached:
- Установите расширение PHP:
pecl install memcached - Добавьте компонент:
'components' => [ 'cache' => [ 'class' => 'yii\caching\MemCache', 'servers' => [ [ 'host' => 'localhost', 'port' => 11211, ], ], ], ],
Пример использования:
Аналогичен Redis и FileCache.
Плюсы:
- Высокая производительность.
- Распределенное хранение.
Минусы:
- Нет встроенной поддержки тегов для кеша.
Кеширование запросов к базе данных
Один из самых частых сценариев это кеширование результатов SQL-запросов. Это особенно полезно для тяжелых запросов, которые выполняются редко.
Использование метода cache():
В Yii 2 Active Record предоставляет метод cache(), который автоматически сохраняет результат запроса.
Пример:
$users = User::find() ->where(['status' => 1]) ->orderBy('id') ->cache(600) // Кешируем на 10 минут ->all();
Как это работает:
- Yii генерирует уникальный ключ на основе SQL-запроса.
- При повторном выполнении того же запроса данные берутся из кеша.
Важно:
- Если данные в базе изменяются, кеш устаревает. Используйте
invalidate()для принудительного обновления.
Фрагментное кеширование в представлениях
Иногда нет смысла кешировать всю страницу, достаточно сохранить отдельные блоки. Для этого используется фрагментное кеширование.
Использование beginCache() и endCache():
В представлении оберните блок кода:
<?php if ($this->beginCache('sidebar', ['duration' => 3600])): ?> <div class="sidebar"> <!-- Содержимое, которое редко меняется --> <?= SomeWidget::widget() ?> </div> <?php $this->endCache(); endif; ?>
Параметры:
durationвремя жизни кеша.dependencyзависимость (например, обновление кеша при изменении файла).
Используйте уникальные ключи для разных фрагментов. Например, включайте в ключ ID пользователя, если блок зависит от него:
$this->beginCache('sidebar_' . Yii::$app->user->id, ...);
Очистка кеша
Рано или поздно кеш устаревает. Рассмотрим, как его очистить.
Ручная очистка
// Удалить конкретный ключ Yii::$app->cache->delete('my_key'); // Очистить весь кеш Yii::$app->cache->flush();
Консольные команды
Yii 2 предоставляет команды для очистки кеша:
# Очистить кеш компонента "cache" yii cache/flush # Очистить кеш конкретного компонента (например, "redisCache") yii cache/flush redisCache
Автоматическая инвалидация
Используйте зависимости (Dependency). Например, обновлять кеш при изменении файла:
use yii\caching\FileDependency; $dependency = new FileDependency(['fileName' => '@app/data.txt']); Yii::$app->cache->set('key', $data, 0, $dependency); // Кеш станет невалидным, если data.txt изменится
Практические задачи
- Файловое кеширование:
- Создайте действие в контроллере, которое сохраняет в кеш массив из 1000 случайных чисел.
- Выводите данные из кеша, если они есть или генерируйте заново.
- Кеширование запросов:
- Найдите 10 самых активных пользователей с помощью Active Record и закешируйте результат на 5 минут.
- Фрагментное кеширование:
- Добавьте блок «Последние статьи» в представление и закешируйте его на 1 час.
- Очистка кеша:
- Напишите консольную команду, которая очищает кеш каждые 24 часа через Cron.
Поздравляю! Теперь вы знаете, как эффективно использовать кеширование в Yii 2. Это серьезно повысит производительность ваших проектов.
Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.


