Урок 10: Кеширование в Yii 2. Файловое, Redis, Memcached, фрагментное кеширование

На 10-ом уроке мы изучим одну из тем для оптимизации ваших приложений, это кеширование в Yii 2. Если вы хотите, чтобы ваш сайт работал быстро даже при большой нагрузке, этот урок станет вашим надежным помощником. Мы разберем типы кеширования, научимся кешировать запросы к базе данных, работать с фрагментным кешированием в представлениях и правильно очищать кеш.

Типы кеширования в Yii 2

Кеширование это сохранение часто используемых данных в быстродоступном хранилище, чтобы сократить время их получения. В Yii 2 поддерживается несколько типов кеширования и выбор зависит от ваших задач и инфраструктуры.

Файловое кеширование

Самый простой способ, это сохранять данные в файлы. Это удобно для небольших проектов или локальной разработки. Yii 2 использует класс FileCache, который хранит кеш в директории @runtime/cache.

Настройка файлового кеша:
Добавьте компонент в конфигурационный файл config/web.php:

php
'components' => [
    'cache' => [
        'class' => 'yii\caching\FileCache',
        // Дополнительные настройки, например:
        'cachePath' => '@app/runtime/cache',
    ],
],

Пример использования:

php
// Сохраняем данные в кеш на 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:

  1. Установите расширение PHP для Redis:
    bash
    pecl install redis
  2. Добавьте компонент в конфигурацию:
    php
    'components' => [
        'cache' => [
            'class' => 'yii\redis\Cache',
            'redis' => [
                'hostname' => 'localhost',
                'port' => 6379,
                'database' => 0,
            ],
        ],
    ],

Пример использования:

php
// Аналогично FileCache
Yii::$app->cache->set('user_42', $userData, 3600);
$userData = Yii::$app->cache->get('user_42');

Плюсы:

  • Высокая скорость.
  • Поддержка сложных структур данных (хеши, списки).

Минусы:

  • Требует установки Redis на сервер.

Memcached

Memcached еще одно популярное хранилище в памяти. Оно отлично справляется с распределенным кешированием.

Настройка Memcached:

  1. Установите расширение PHP:
    bash
    pecl install memcached
  2. Добавьте компонент:
    php
    'components' => [
        'cache' => [
            'class' => 'yii\caching\MemCache',
            'servers' => [
                [
                    'host' => 'localhost',
                    'port' => 11211,
                ],
            ],
        ],
    ],

Пример использования:
Аналогичен Redis и FileCache.

Плюсы:

  • Высокая производительность.
  • Распределенное хранение.

Минусы:

  • Нет встроенной поддержки тегов для кеша.

Кеширование запросов к базе данных

Один из самых частых сценариев это кеширование результатов SQL-запросов. Это особенно полезно для тяжелых запросов, которые выполняются редко.

Использование метода cache():
В Yii 2 Active Record предоставляет метод cache(), который автоматически сохраняет результат запроса.

Пример:

php
$users = User::find()
    ->where(['status' => 1])
    ->orderBy('id')
    ->cache(600) // Кешируем на 10 минут
    ->all();

Как это работает:

  • Yii генерирует уникальный ключ на основе SQL-запроса.
  • При повторном выполнении того же запроса данные берутся из кеша.

Важно:

  • Если данные в базе изменяются, кеш устаревает. Используйте invalidate() для принудительного обновления.

Фрагментное кеширование в представлениях

Иногда нет смысла кешировать всю страницу, достаточно сохранить отдельные блоки. Для этого используется фрагментное кеширование.

Использование beginCache() и endCache():
В представлении оберните блок кода:

php
<?php if ($this->beginCache('sidebar', ['duration' => 3600])): ?>
    <div class="sidebar">
        <!-- Содержимое, которое редко меняется -->
        <?= SomeWidget::widget() ?>
    </div>
<?php $this->endCache(); endif; ?>

Параметры:

  • duration время жизни кеша.
  • dependency зависимость (например, обновление кеша при изменении файла).

Используйте уникальные ключи для разных фрагментов. Например, включайте в ключ ID пользователя, если блок зависит от него:

php
$this->beginCache('sidebar_' . Yii::$app->user->id, ...);

Очистка кеша

Рано или поздно кеш устаревает. Рассмотрим, как его очистить.

Ручная очистка

php
// Удалить конкретный ключ
Yii::$app->cache->delete('my_key');

// Очистить весь кеш
Yii::$app->cache->flush();

Консольные команды

Yii 2 предоставляет команды для очистки кеша:

bash
# Очистить кеш компонента "cache"
yii cache/flush

# Очистить кеш конкретного компонента (например, "redisCache")
yii cache/flush redisCache

Автоматическая инвалидация

Используйте зависимости (Dependency). Например, обновлять кеш при изменении файла:

php
use yii\caching\FileDependency;

$dependency = new FileDependency(['fileName' => '@app/data.txt']);
Yii::$app->cache->set('key', $data, 0, $dependency);
// Кеш станет невалидным, если data.txt изменится

Практические задачи

  1. Файловое кеширование:
    • Создайте действие в контроллере, которое сохраняет в кеш массив из 1000 случайных чисел.
    • Выводите данные из кеша, если они есть или генерируйте заново.
  2. Кеширование запросов:
    • Найдите 10 самых активных пользователей с помощью Active Record и закешируйте результат на 5 минут.
  3. Фрагментное кеширование:
    • Добавьте блок «Последние статьи» в представление и закешируйте его на 1 час.
  4. Очистка кеша:
    • Напишите консольную команду, которая очищает кеш каждые 24 часа через Cron.

Поздравляю! Теперь вы знаете, как эффективно использовать кеширование в Yii 2. Это серьезно повысит производительность ваших проектов.

Полный курс с уроками по Yii 2 для начинающих

Поделиться статьей:
Поддержать автора блога

Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.

Персональные рекомендации
Оставить комментарий