Урок 8: Кэширование в Yii2

Сегодня мы разберёмся с кэширование. Без этого не обходится ни один крупный проект. Благодарю кэширование можно ускорить работу вашего проекта в десятки раз!

В Yii2 предусмотрено аж 9 способов кэширования информации:

  1. Memcache (memcache и memcached)
  2. FileCache
  3. DbCache
  4. WinCache
  5. Redis кэширование
  6. XCache
  7. DummyCache
  8. ApcCache
  9. Zend Data Cache

Разумеется не все эти способы столь популярны в веб-разработке, поэтому сегодня мы затронем первые 3 способа: кэширование в ОЗУ, в файлы, в таблицу базы данных.

1. Memcache

Пожалуй, один из самых популярных способов кэширования — memcache. Все данные сохраняются в оперативную память на основе хеш-таблиц. Это довольно простой и быстрый способ кэширования ваших данных. Однако для начала вам нужно установить данное ПО на ваш сервис. Для этого прочтите мою статью по установке. Затем вам нужно настроить кэширование в config/web.php. Открываем файл настроек и в компоненты добавляем следующий код:

'cache' => [
'class' => 'yii\caching\MemCache',
'servers' => [
    [
        'host' => 'localhost',
        'port' => 11211,
    ],
 ],
 'useMemcached' => true,
],

2. FileCache

Второй, не менее популярный способ кэширования — сохранение данных в файл. Ничего устанавливать вам для этого не нужно, необходимо лишь настроить в конфиге yii2. Открываем всё тот же файл config/web.php и вставляем следующий код:

'fileCache' => [
    'class' => 'yii\caching\FileCache',
],

3. DbCache

Тоже не менее удобный способ хранить ваши данных — сохранение в таблицу базы данных. Для начала необходимо создать таблицу, которая будет хранить наш кэш. Выполним SQL запрос:

CREATE TABLE cache (
    id char(128) NOT NULL PRIMARY KEY,
    expire int(11),
    data LONGBLOB
);

*Учтите, что LONGBLOB используется для MySQL. Для PostgreSQL необходимо использовать BYTEA, а для MSSQL — BLOB.

Разработчики yii2 рекомендуют создавать индекс для expire. Это увеличит скорость работы.

API Cache

Все компоненты имеют один базовой класс yii/caching/Cache, поэтому у всех 9 способов кэширования один API, что очень удобно.

get($key) — возвращает данные по указанному ключу $key. Если данные отсутствуют, будет возвращено false, поэтому никогда не кэшируйте значение false. Вы можете обернуть false в массив ($array = [‘value’ => false]) и тогда закэшировать его.

set($key, $value, $duration = 0) — устанавливает новое значение $value для уже существующего ключа $key с длительностью $duration секунд.

add($key, $value, $duration = 0) — добавление данных $value для нового ключа $key с длительностью $duration секунд.

delete($key) — удаление данных по ключу $key.

flush() — удаление всех данных (полная очистка кэша) .

exists($key) — проверяет наличие данных в кэше по ключу $key.

Еще есть multiGet(), multiSet() и multiAdd(), но я сомневаюсь, что вы когда-нибудь будете ими пользоваться.

Несколько примеров…

Давайте рассмотрим вариант кэширования:

<?php
$cache = Yii::$app->cache;
$key = "deone";
$cache->add($key, "deone.ru", 60);
?>

Вот так закэшировали данные на 1 минуту. Теперь попробуем извлечь.

$data = $cache->get($key);
if (!$data) {
    echo 'Empty!';
    return false;
} else echo $data;

В итоге будет выведено «deone.ru». А теперь добавим sleep() перед извлечением:

sleep(61);
$data = $cache->get($key);
if (!$data) {
    echo 'Empty!';
    return false;
} else echo $data;

Будете выведено «Empty!».
В результате примерный код кэширование будет выглядеть следующим образом:

$cache = Yii::$app->cache;
$key = "deone";
$data = $cache->get($key);
if (!$data) {
    $cache->add($key, "deone.ru", 60);
} else echo $data;

Ничего сложного нет, а если вы раньше работали с Memcached на чистом PHP, то по сути тут разницы вообще нет. Проверить работоспособность вашего кода можно, если кэшировать случайное число. Допустим, rand() вернуло 1234, мы кэшируем эту цифру и в следующий раз тоже будет выведено 1234, пока не истечет срок кэширования, либо вы не удалите кэш.

На этом всё. Если у вас будут вопросы — задавайте, помогу.

Урок 8: Кэширование в Yii2: 2 комментария

  1. в пункте 2, после фразы «ставляем следующий код:»
    сообственно отсутствует этот самый код. Поправьте.
    Расскажите, если знаете, по-подробней, об FileCache.
    Как копии js/css файлов, попадают в папку backend/web/assets(используется advanced template).
    И как Yii2 понимает, что если содержимое оригинала сменилось, то нужно и сменить копию.

  2. Привет! Там еще есть кэширование для запросов. Вот только не пойму, как там при задании кэша задать ключ к нему, чтобы можно было удалить кэш одного запроса, а не сносить весь на сайте. Я про вот это:
    $result = Customer::getDb()->cache(function ($db) {
    return Customer::find()->where([‘id’ => 1])->one();
    });
    Спасибо!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *