Yii2 очистить кэш вручную

Обновлено: 06.07.2024

Как известно, кэширование - это способ повышения производительности (скорости) WEB-приложения, при котором данные не генерируются кодом php и базой данных каждый раз, а сохраняются в определенном месте при первом запросе и потом только считываются. Место хранения кэша и время которое он хранится устанавливается разработчиком.

Подробнее об этом можно почитать тут, а в этой заметке, я приведу несколько практических приемов работы с кэшем.

Общий кэш для backend и frontend.

  • backend\runtime\cache;
  • frontend\runtime\cache.

Кэш в базе данных, миграция.

Среди вариантов выбора мест хранения кэша, есть такой как хранение его в базе данных. Для этого необходимо указать в все том же файле common\config\main.php класс работающий с БД:
Чтобы использовать этот кэш, нужно создать таблицу определенным образом. Если пользуетесь миграциями при работе с БД, или по-крайней мере умеете их запускать, вот готовый код миграции создающей такую таблицу:

Автоматическое удаление кэша при обновлении записи в базе данных.

При внесении изменений в БД (например редактирование поста в админке), данные в кэше становятся не актуальными. Использование зависимостей (dependency) не всегда помогает (например если запись была изменена, а не добавлена). В этом случае можно к модели, которая отвечает за нужную таблицу используемую в кэшировании (например виджета), подключить поведение с событиями для ActiveRecord:
EVENT_AFTER_INSERT
EVENT_AFTER_UPDATE
EVENT_AFTER_DELETE
которые при каждом срабатывании будут удалять нужный кэш. Для того, чтобы удалить кэш frontend a из админки, используется общее хранилище кэша для backend и frontend (как сделать - читать выше).

Создаем файл CachedBehavior.php в папке common\components\behaviors
Тут мы создали класс-поведение (подробнее про поведения тут), который с помощью метода events() устанавливает обработчики событий (про события тут) для класса работающего с БД (ActiveRecord). А именно - при вставке/обновлении/удалении данных, будет вызываться метод deleteCache(), который будет удалять нужный кэш (по переданному из модели названию кэша/id).

Подключение в модели, которая обновляет данные хранимые в кэше:
тут в качестве элемента массива 'cache_id' нужно передать название кэша который нужно удалить (id кэша), в данном случае 'CloudWidget'. Можно передавать несколько значений.

Автоматическое удаление кэша при выполнении действий контроллера.

Если вы выполняете действия контроллера которые делают неактуальными файлы в кэше, стоит настроить автоматическое удаление таких файлов. Например в админке удаляете пост (действие actionDelete()) и желаете изменить файл карты сайта для поисковых служб, т.к. он становится неактуальным. Это можно сделать с помощью кода указанного в предыдущей главе, основываясь на событиях ActiveRecord , но данная модель с привязкой поведения используется и в frontend при выводе тех же постов, где привязка такого поведения не нужна. Поэтому есть вариант основанный на событии EVENT_BEFORE_ACTION контроллера. Причем того, который нужен - в backend.

Для того, чтобы удалить кэш frontend a из админки, используется общее хранилище кэша для backend и frontend (как сделать - читать выше).
Вставляем класс поведения в backend\controllers\PostController.php
Файл common\components\behaviors\DelcacheBehavior.php
Все, файл кэша CloudWidget удален.

Примеры кэширования.

1. Кэширование фрагментов страницы.
Применяется, если нужно закэшировать часть страницы, например вывод виджетов:

2. Кеширование данных (значения переменной).

3. Кэширование запросов к БД.
Кэширование запросов может быть использовано как для DAO, так и для ActiveRecord

Кэширование данных заключается в сохранении некоторой переменной PHP в кэше и её последующем извлечении. Оно является основой для расширенных возможностей, таких как кэширование запросов и кэширование страниц.

Приведённый ниже код является типичным случаем кэширования данных, где $cache указывает на компонент кэширования:

Начиная с версии 2.0.11, компонент кэширования предоставляет метод getOrSet(), который упрощает код при получении, вычислении и сохранении данных. Приведённый ниже код делает в точности то же самое, что и код в предыдущем примере:

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

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

Примечание: В getOrSet() можно передать срок действия и зависимости кэша. Прочтите Срок действия кэша и Зависимости кеша чтобы узнать больше.

Компоненты кэширования ¶

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

Вы можете получить доступ к компоненту кэша, используя выражение Yii::$app->cache .

Поскольку все компоненты кэша поддерживают единый API-интерфейс - вы можете менять основной компонент кэша на другой через конфигурацию приложения. Код, использующий кэш, при этом не меняется. Например, можно изменить конфигурацию выше для использования APC cache следующим образом:

Подсказка: Вы можете зарегистрировать несколько кэш-компонентов приложения. Компонент с именем cache используется по умолчанию многими классами (например, yii\web\UrlManager).

Поддерживаемые хранилища ¶

Yii поддерживает множество хранилищ кэша:

    : использует расширение PHP APC. Эта опция считается самой быстрой при работе с кэшем в «толстом» централизованном приложении (т.е. один сервер, без выделенного балансировщика нагрузки и т.д.); : использует таблицу базы данных для хранения кэшированных данных. Чтобы использовать этот кэш, вы должны создать таблицу так, как это описано в yii\caching\DbCache::$cacheTable; : является кэшем-пустышкой, не реализующим реального кэширования. Смысл этого компонента в упрощении кода, проверяющего наличие кэша. Вы можете использовать данный тип кэша и переключиться на реальное кэширование позже. Примеры: использование при разработке; если сервер не поддерживает кэш. Для извлечения данных в этом случае используется один и тот же код Yii::$app->cache->get($key) . При этом можно не беспокоиться, что Yii::$app->cache может быть null ; : использует обычные файлы для хранения кэшированных данных. Замечательно подходит для кэширования больших кусков данных, таких как содержимое страницы; : использует расширения PHP memcache и memcached. Этот вариант может рассматриваться как самый быстрый при работе в распределенных приложениях (например, с несколькими серверами, балансировкой нагрузки и так далее);
  • yii\redis\Cache : реализует компонент кэша на основе Redis, хранилища ключ-значение (требуется Redis версии 2.6.12 или выше); : использует расширение PHP WinCache (смотрите также); (deprecated): использует расширение PHP XCache; (deprecated): использует Zend Data Cache.

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

Кэш API, ¶

У всех компонентов кэша имеется один базовый класс yii\caching\Cache со следующими методами:

    : возвращает данные по указанному ключу. Если данные не найдены или устарели, то значение false будет возвращено; : сохраняет данные по ключу; : сохраняет данные по ключу если такого ключа ещё нет; : возвращает данные по указанному ключу или выполняет переданную анонимную функцию для вычисления значения, а полученные данные сохраняет в кэш и возвращает; : извлекает сразу несколько элементов данных из кэша по заданным ключам; : сохраняет несколько элементов данных. Каждый элемент идентифицируется ключом; : сохраняет несколько элементов данных. Каждый элемент идентифицируется ключом. Если ключ уже существует, то сохранения не происходит; : есть ли указанный ключ в кэше; : удаляет указанный ключ; : удаляет все данные.

Примечание: Не кэшируйте непосредственно значение false , потому что get() использует false для случая, когда данные не найдены в кэше. Вы можете обернуть false в массив и закэшировать его, чтобы избежать данной проблемы.

Некоторые кэш-хранилища, например, MemCache или APC, поддерживают получение нескольких значений в пакетном режиме, что может сократить накладные расходы на получение данных. Данную возможность возможно использовать при помощи multiGet() и multiAdd(). В случае, если хранилище не поддерживает эту функцию, она будет имитироваться.

Так как yii\caching\Cache реализует ArrayAccess - следовательно компонент кэша можно использовать как массив:

Ключи кэша ¶

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

Вы можете использовать строку или произвольное значение в качестве ключа кэша. Если ключ не строка, то он будет автоматически сериализован в строку.

Обычно ключ задаётся массивом всех значимых частей. Например, для хранения информации о таблице в yii\db\Schema используются следующие части для ключа:

Как вы можете видеть, ключ строится так, чтобы однозначно идентифицировать данные таблицы.

Если одно хранилище кэша используется несколькими приложениями, стоит указать префикс ключа во избежание конфликтов. Сделать это можно путём настройки yii\caching\Cache::$keyPrefix:

Для обеспечения совместимости должны быть использованы только алфавитно-цифровые символы.

Срок действия кэша ¶

Элементы данных, хранимые в кэше, остаются там навсегда и могут быть удалены только из-за особенностей функционирования хранилища (например, место для кэширования заполнено и старые данные удаляются). Чтобы изменить этот режим, вы можете передать истечение срока действия ключа при вызове метода set(). Параметр указывает на то, сколько секунд элемент кэша может считаться актуальным. Если срок годности ключа истёк, get() вернёт false :

Начиная с версии 2.0.11 вы можете изменить значение по умолчанию (бесконечность) для длительности кэширования задав defaultDuration в конфигурации компонента кэша. Таким образом, можно будет не передавать значение duration в set() каждый раз.

Зависимости кэша ¶

В добавок к изменению срока действия ключа элемент может быть признан недействительным из-за изменения зависимостей. К примеру, yii\caching\FileDependency представляет собой зависимость от времени изменения файла. Когда это время изменяется, любые устаревшие данные, найденные в кэше, должны быть признаны недействительным, а get() в этом случае должен вернуть false .

Зависимости кэша представлены в виде объектов потомков класса yii\caching\Dependency. Когда вы вызываете set() метод, чтобы сохранить элемент данных в кэше, вы можете передать туда зависимость.

Ниже приведен список доступных зависимостей кэша:

    : зависимость меняется, если любая зависимость в цепочке изменяется; : зависимость меняется, если результат некоторого определенного SQL запроса изменён; : зависимость меняется, если результат определенного PHP выражения изменён; : зависимость меняется, если изменилось время последней модификации файла; : Связывает кэшированные данные элемента с одним или несколькими тегами. Вы можете аннулировать кэширование данных элементов с заданным тегом(тегами) по вызову. yii\caching\TagDependency::invalidate();

Кэширование запросов ¶

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

Кэширование запросов требует DB connection действительный cache компонента приложения. Предпологая, что $db это yii\db\Connection экземпляр, простое использование запросов кэширования происходит следующим образом:

Кэширование запросов может быть использовано как для DAO, так и для ActiveRecord:

Информация: Некоторые СУБД (например, MySQL) поддерживают кэширование запросов любого механизма на стороне сервера БД. КЗ описано разделом выше. Оно имеет безусловное преимущество, поскольку, благодаря ему, можно указать гибкие зависимости кэша и это более эффективно.

Очистка кэша ¶

Для очистки всего кэша, вы можете вызвать yii\caching\Cache::flush().

Также вы можете очистить кэш из консоли, вызвав yii cache/flush .

  • yii cache : отображает список доступных кэширующих компонентов приложения
  • yii cache/flush cache1 cache2 : очищает кэш в компонентах cache1 , cache2 (можно передать несколько названий компонентов кэширования, разделяя их пробелом)
  • yii cache/flush-all : очищает кэш во всех кэширующих компонентах приложения
  • yii cache/flush-schema db : очищает кеш схемы базы данных для данного компонента соединения

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

Конфигурации ¶

Кэширование запросов имеет три глобальных конфигурационных параметра через yii\db\Connection:

    : включить или выключить кэширование запросов; По умолчанию true . Стоит отметить, что для использования кэширования вам может понадобиться компонент cache, как показано в queryCache; : количество секунд кэширования результата. Для бесконечного кэша используйте 0 . Именно это значение выставляется yii\db\Connection::cache(), если не указать время явно; : ID компонента кэширования. По умолчанию 'cache' . Кэширования запросов работает только в том случае, если используется компонент приложения кэш.

Использование ¶

Вы можете использовать yii\db\Connection::cache(), если у вас есть несколько SQL запросов, которые необходимо закэшировать:

Любые SQL запросы в анонимной функции будут кэшироваться в течение указанного промежутка времени и с помощью заданной зависимости. Если результат запроса в кэше актуален, запрос будет пропущен, и вместо этого из кэша будет возвращен результат. Если вы не укажете параметр '$duration' , то значение queryCacheDuration будет использоваться вместо него.

Иногда в пределах "cache()" вы можете захотеть отключить кэширование запроса. В этом случае вы можете использовать yii\db\Connection::noCache().

Если вы просто хотите использовать кэширование для одного запроса, вы можете вызвать yii\db\Command::cache() при построении команды. Например:

Вы также можете использовать yii\db\Command::noCache() для отключения кэширования запросов для одной команды. Например:

Ограничения ¶

Кэширование запросов не работает с результатами запросов, которые содержат обработчики ресурсов. Например, при использовании столбца типа BLOB в некоторых СУБД, в качестве результата запроса будет возвращен указатель на ресурс для этого столбца данных.

Некоторые кэш хранилища имеют ограничение в размере данных. Например, Memcache ограничивает максимальный размер каждой записи до 1 Мб. Таким образом, если результат запроса превышает этот предел, данные не будут закэшированы.

Yii2: Кэширование данных (примеры)

Кэширование данных заключается в сохранении некоторой переменной PHP в кэше и её последующем извлечении. Оно является основой для расширенных возможностей, таких как кэширование запросов и кэширование страниц.

Кэширование данных (Полное руководство по Yii 2.0) здесь

Abstract Class yii\caching\Cache (API Documentation) здесь

По-умолчанию кэш в Yii2 ( Advanced ) разделён и сохраняется в соответствующие каталоги: backend\runtime\cache и frontend\runtime\cache . Убедиться в этом можно, вызвав команду Yii::$app->cache из frontend или backend, соответственно.

Для того, чтобы иметь возможность работать с кэшем другого приложения (например из backend удалить кэш frontend) можно указать для этих приложений общее хранилище. Весь кэш приложений будем хранить в каталоге common , затем будем удалять нужный нам кэш (в том числе кэш frontend) из админки.

В файле common\config\main.php :

В приложении одновременно можно использовать разные способы хранения кэша. Об остальных поддерживаемых хранилищах читайте в документации, я же буду использовать (для примера) только yii\caching\FileCache .

Кэширование произвольных данных (результаты выборки, данные внутри виджетов и тп.)

Начиная с версии 2.0.11, компонент кэширования предоставляет метод getOrSet() , который упрощает код при получении, вычислении и сохранении данных. Приведённый ниже код делает в точности то же самое, что и код в предыдущем примере:

Кэширование фрагментов

Кэширование фрагментов относится к кэшированию фрагментов страницы. Обычно кэширование фрагментов используйтся в представлении:

Срок хранения duration . По умолчанию, если срок хранения не указан $defaultDuration = 0 . Это означает то, что время хранения бесконечен.

Вариации variations на примере кэширования виджета категорий:

Кэширование запросов

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

В пределах cache() вы можете отключить кэширование запроса. В этом случае вы можете использовать [[yii\db\Connection::noCache()]] :

Если вы просто хотите использовать кэширование для одного запроса, вы можете вызвать [[yii\db\Command::cache()]] при построении команды:

Можете использовать [[yii\db\Command::noCache()]] для отключения кэширования запросов для одной команды:

Кэширование страниц

Кэширование страниц — это кэширование всего содержимого страницы на стороне сервера. Когда эта страница будет запрошена, сервер вернет её из кэша вместо того чтобы генерировать её заново.

Приведённый код задействует кэширование только для действия view . Содержимое страницы кэшируется максимум на 1 час и варьируется в зависимости от текущего языка приложения. Кэшированная страница должна быть признана просроченной, если поле update_at изменилось.

Кэширование страниц очень похоже на кэширование фрагментов. В обоих случаях поддерживаются параметры duration (продолжительность), dependencies (зависимости), variations (вариации), и enabled (включен). Главное отличие заключается в том, что кэширование страницы реализовано в виде фильтра действия, а кэширование фрагмента в виде виджета.

Очистка кэша

Для очистки всего кэша, вы можете вызвать [[yii\caching\Cache::flush()]] .

Очистить кэш из консоли можно вызвав yii cache/flush .

  • yii cache : отображает список доступных кэширующих компонентов приложения
  • yii cache/flush cache1 cache2 : очищает кэш в компонентах cache1, cache2 (можно передать несколько названий компонентов кэширования, разделяя их пробелом)
  • yii cache/flush-all : очищает кэш во всех кэширующих компонентах приложения

Внимание!

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

Очистить кэш из контроллера:

Очистить кэш фрагмента по ключу:

Автоматическое удаление кэша при обновлении записи в базе данных

Когда в БД вносятся изменения (добавление, редактирование, удалении записи в админке), данные в кэше становятся неактуальными. В этом случае можно к модели, которая отвечает за нужную таблицу подключить поведение с событиями для ActiveRecord ( EVENT_AFTER_INSERT , EVENT_AFTER_UPDATE , EVENT_AFTER_DELETE ), которые при каждом срабатывании будут удалять нужный кэш.

файл CachedBehavior.php в папке common\components\behaviors :

Подключаем поведение к нужной модели:

Автоматическое удаление кэша при выполнении действий контроллера

Код, указанный выше обновляет кэш при действиях, указаных в поведении CachedBehavior . Данное поведение привязано к модели, которая в свою очередь занимается ещё выборкой записей. Такой подход в данном случае не очень интнресный, поэтому мы воспользуемся методом удаления кэша из контроллера. Плюсом такого метода является то, что мы можем на нужный нам контроллер навесить нужные события и в конечном итоге модель будет заниматься только логикой (выборка данных и тд), а контроллер по событию каких-либо действий с записями удалять нужный кэш.

Добавляем поведение в контроллер (у меня это backend\controllers\CategoryController.php ):

Удаление кэша по тэгу

Class yii\caching\TagDependency (API Documentation) здесь

При кэшировании данных мы указываем зависимость:

В нужном нам контроллере и нужном экшене (после сохранения модели):

На гитхабе нашёл вот такой trait. Сам не пробовал использовать. Кому интересно, посмотрите.

Простой сервис для удаления кэша по тэгу

Пример очень простого сервиса по по очистке кэша по тэгу. Дело в том, что лучше бы не вызывать постоянно $cache = Yii::$app->cache; , а работать с объектом кэша напрямую через некий сервис, который будет в нужный нам момент очищать кэш по тэгу.

Там где получаем данные (модель или лучше отдельный репозиторий для получения данных):

Обертка для кэширования данных в Yii2

Можно кэширование обернуть в функцию и избавить себя от многократного писания переменных $data, $cache, $key. Тем более, если рядом используется кэширование нескольких фрагментов данных.

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

  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents Loading

Copy raw contents

Copy raw contents

Кэширование данных заключается в сохранении некоторой переменной PHP в кэше и её последующем извлечении. Оно является основой для расширенных возможностей, таких как кэширование запросов и кэширование страниц.

Приведённый ниже код является типичным случаем кэширования данных, где $cache указывает на компонент кэширования:

Начиная с версии 2.0.11, компонент кэширования предоставляет метод [[yii\caching\Cache::getOrSet()|getOrSet()]], который упрощает код при получении, вычислении и сохранении данных. Приведённый ниже код делает в точности то же самое, что и код в предыдущем примере:

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

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

Note: В [[yii\caching\Cache::getOrSet()|getOrSet()]] можно передать срок действия и зависимости кэша. Прочтите Срок действия кэша и Зависимости кеша чтобы узнать больше.

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

Вы можете получить доступ к компоненту кэша, используя выражение Yii::$app->cache .

Поскольку все компоненты кэша поддерживают единый API-интерфейс - вы можете менять основной компонент кэша на другой через конфигурацию приложения. Код, использующий кэш, при этом не меняется. Например, можно изменить конфигурацию выше для использования [[yii\caching\ApcCache|APC cache]] следующим образом:

Tip: Вы можете зарегистрировать несколько кэш-компонентов приложения. Компонент с именем cache используется по умолчанию многими классами (например, [[yii\web\UrlManager]]).

Yii поддерживает множество хранилищ кэша:

  • [[yii\caching\ApcCache]]: использует расширение PHP APC. Эта опция считается самой быстрой при работе с кэшем в «толстом» централизованном приложении (т.е. один сервер, без выделенного балансировщика нагрузки и т.д.);
  • [[yii\caching\DbCache]]: использует таблицу базы данных для хранения кэшированных данных. Чтобы использовать этот кэш, вы должны создать таблицу так, как это описано в [[yii\caching\DbCache::cacheTable]];
  • [[yii\caching\DummyCache]]: является кэшем-пустышкой, не реализующим реального кэширования. Смысл этого компонента в упрощении кода, проверяющего наличие кэша. Вы можете использовать данный тип кэша и переключиться на реальное кэширование позже. Примеры: использование при разработке; если сервер не поддерживает кэш. Для извлечения данных в этом случае используется один и тот же код Yii::$app->cache->get($key) . При этом можно не беспокоиться, что Yii::$app->cache может быть null ;
  • [[yii\caching\FileCache]]: использует обычные файлы для хранения кэшированных данных. Замечательно подходит для кэширования больших кусков данных, таких как содержимое страницы;
  • [[yii\caching\MemCache]]: использует расширения PHP memcache и memcached. Этот вариант может рассматриваться как самый быстрый при работе в распределенных приложениях (например, с несколькими серверами, балансировкой нагрузки и так далее);
  • [[yii\redis\Cache]]: реализует компонент кэша на основе Redis, хранилища ключ-значение (требуется Redis версии 2.6.12 или выше);
  • [[yii\caching\WinCache]]: использует расширение PHP WinCache (смотрите также);
  • [[yii\caching\XCache]] (deprecated): использует расширение PHP XCache;
  • [[yii\caching\ZendDataCache]] (deprecated): использует Zend Data Cache.

Tip: Вы можете использовать разные способы хранения кэша в одном приложении. Общая стратегия заключается в использовании памяти под хранение небольших часто используемых данных (например, статистические данные). Для больших и реже используемых данных (например, содержимое страницы) лучше использовать файлы или базу данных.

У всех компонентов кэша имеется один базовый класс [[yii\caching\Cache]] со следующими методами:

  • [[yii\caching\Cache::get()|get()]]: возвращает данные по указанному ключу. Если данные не найдены или устарели, то значение false будет возвращено;
  • [[yii\caching\Cache::set()|set()]]: сохраняет данные по ключу;
  • [[yii\caching\Cache::add()|add()]]: сохраняет данные по ключу если такого ключа ещё нет;
  • [[yii\caching\Cache::getOrSet()|getOrSet()]]: возвращает данные по указанному ключу или выполняет переданную анонимную функцию для вычисления значения, а полученные данные сохраняет в кэш и возвращает;
  • [[yii\caching\Cache::multiGet()|multiGet()]]: извлекает сразу несколько элементов данных из кэша по заданным ключам;
  • [[yii\caching\Cache::multiSet()|multiSet()]]: сохраняет несколько элементов данных. Каждый элемент идентифицируется ключом;
  • [[yii\caching\Cache::multiAdd()|multiAdd()]]: сохраняет несколько элементов данных. Каждый элемент идентифицируется ключом. Если ключ уже существует, то сохранения не происходит;
  • [[yii\caching\Cache::exists()|exists()]]: есть ли указанный ключ в кэше;
  • [[yii\caching\Cache::delete()|delete()]]: удаляет указанный ключ;
  • [[yii\caching\Cache::flush()|flush()]]: удаляет все данные.

Note: Не кэшируйте непосредственно значение false , потому что [[yii\caching\Cache::get()|get()]] использует false для случая, когда данные не найдены в кэше. Вы можете обернуть false в массив и закэшировать его, чтобы избежать данной проблемы.

Некоторые кэш-хранилища, например, MemCache или APC, поддерживают получение нескольких значений в пакетном режиме, что может сократить накладные расходы на получение данных. Данную возможность возможно использовать при помощи [[yii\caching\Cache::multiGet()|multiGet()]] и [[yii\caching\Cache::multiAdd()|multiAdd()]]. В случае, если хранилище не поддерживает эту функцию, она будет имитироваться.

Так как [[yii\caching\Cache]] реализует ArrayAccess - следовательно компонент кэша можно использовать как массив:

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

Вы можете использовать строку или произвольное значение в качестве ключа кэша. Если ключ не строка, то он будет автоматически сериализован в строку.

Обычно ключ задаётся массивом всех значимых частей. Например, для хранения информации о таблице в [[yii\db\Schema]] используются следующие части для ключа:

Как вы можете видеть, ключ строится так, чтобы однозначно идентифицировать данные таблицы.

Если одно хранилище кэша используется несколькими приложениями, стоит указать префикс ключа во избежание конфликтов. Сделать это можно путём настройки [[yii\caching\Cache::keyPrefix]]:

Для обеспечения совместимости должны быть использованы только алфавитно-цифровые символы.

Срок действия кэша

Элементы данных, хранимые в кэше, остаются там навсегда и могут быть удалены только из-за особенностей функционирования хранилища (например, место для кэширования заполнено и старые данные удаляются). Чтобы изменить этот режим, вы можете передать истечение срока действия ключа при вызове метода [[yii\caching\Cache::set()|set()]]. Параметр указывает на то, сколько секунд элемент кэша может считаться актуальным. Если срок годности ключа истёк, [[yii\caching\Cache::get()|get()]] вернёт false :

Начиная с версии 2.0.11 вы можете изменить значение по умолчанию (бесконечность) для длительности кэширования задав [[yii\caching\Cache::$defaultDuration|defaultDuration]] в конфигурации компонента кэша. Таким образом, можно будет не передавать значение duration в [[yii\caching\Cache::set()|set()]] каждый раз.

В добавок к изменению срока действия ключа элемент может быть признан недействительным из-за изменения зависимостей. К примеру, [[yii\caching\FileDependency]] представляет собой зависимость от времени изменения файла. Когда это время изменяется, любые устаревшие данные, найденные в кэше, должны быть признаны недействительным, а [[yii\caching\Cache::get()|get()]] в этом случае должен вернуть false .

Зависимости кэша представлены в виде объектов потомков класса [[yii\caching\Dependency]]. Когда вы вызываете [[yii\caching\Cache::set()|set()]] метод, чтобы сохранить элемент данных в кэше, вы можете передать туда зависимость.

Ниже приведен список доступных зависимостей кэша:

  • [[yii\caching\ChainedDependency]]: зависимость меняется, если любая зависимость в цепочке изменяется;
  • [[yii\caching\DbDependency]]: зависимость меняется, если результат некоторого определенного SQL запроса изменён;
  • [[yii\caching\ExpressionDependency]]: зависимость меняется, если результат определенного PHP выражения изменён;
  • [[yii\caching\FileDependency]]: зависимость меняется, если изменилось время последней модификации файла;
  • [[yii\caching\TagDependency]]: Связывает кэшированные данные элемента с одним или несколькими тегами. Вы можете аннулировать кэширование данных элементов с заданным тегом(тегами) по вызову. [[yii\caching\TagDependency::invalidate()]];

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

Кэширование запросов требует [[yii\db\Connection|DB connection]] действительный cache компонента приложения. Предпологая, что $db это [[yii\db\Connection]] экземпляр, простое использование запросов кэширования происходит следующим образом:

Кэширование запросов может быть использовано как для DAO, так и для ActiveRecord:

Info: Некоторые СУБД (например, MySQL) поддерживают кэширование запросов любого механизма на стороне сервера БД. КЗ описано разделом выше. Оно имеет безусловное преимущество, поскольку, благодаря ему, можно указать гибкие зависимости кэша и это более эффективно.

Для очистки всего кэша, вы можете вызвать [[yii\caching\Cache::flush()]].

Также вы можете очистить кэш из консоли, вызвав yii cache/flush .

  • yii cache : отображает список доступных кэширующих компонентов приложения
  • yii cache/flush cache1 cache2 : очищает кэш в компонентах cache1 , cache2 (можно передать несколько названий компонентов кэширования, разделяя их пробелом)
  • yii cache/flush-all : очищает кэш во всех кэширующих компонентах приложения
  • yii cache/flush-schema db : очищает кеш схемы базы данных для данного компонента соединения

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

Кэширование запросов имеет три глобальных конфигурационных параметра через [[yii\db\Connection]]:

  • [[yii\db\Connection::enableQueryCache|enableQueryCache]]: включить или выключить кэширование запросов; По умолчанию true . Стоит отметить, что для использования кэширования вам может понадобиться компонент cache, как показано в [[yii\db\Connection::queryCache|queryCache]];
  • [[yii\db\Connection::queryCacheDuration|queryCacheDuration]]: количество секунд кэширования результата. Для бесконечного кэша используйте 0 . Именно это значение выставляется [[yii\db\Connection::cache()]], если не указать время явно;
  • [[yii\db\Connection::queryCache|queryCache]]: ID компонента кэширования. По умолчанию 'cache' . Кэширования запросов работает только в том случае, если используется компонент приложения кэш.

Вы можете использовать [[yii\db\Connection::cache()]], если у вас есть несколько SQL запросов, которые необходимо закэшировать:

Любые SQL запросы в анонимной функции будут кэшироваться в течение указанного промежутка времени и с помощью заданной зависимости. Если результат запроса в кэше актуален, запрос будет пропущен, и вместо этого из кэша будет возвращен результат. Если вы не укажете параметр '$duration' , то значение [[yii\db\Connection::queryCacheDuration|queryCacheDuration]] будет использоваться вместо него.

Иногда в пределах "cache()" вы можете захотеть отключить кэширование запроса. В этом случае вы можете использовать [[yii\db\Connection::noCache()]].

Если вы просто хотите использовать кэширование для одного запроса, вы можете вызвать [[yii\db\Command::cache()]] при построении команды. Например:

Вы также можете использовать [[yii\db\Command::noCache()]] для отключения кэширования запросов для одной команды. Например:

Кэширование запросов не работает с результатами запросов, которые содержат обработчики ресурсов. Например, при использовании столбца типа BLOB в некоторых СУБД, в качестве результата запроса будет возвращен указатель на ресурс для этого столбца данных.

Некоторые кэш хранилища имеют ограничение в размере данных. Например, Memcache ограничивает максимальный размер каждой записи до 1 Мб. Таким образом, если результат запроса превышает этот предел, данные не будут закэшированы.

Кэширование данных заключается в сохранении некоторой переменной PHP в кэше и её последующем извлечении. Оно является основой для расширенных возможностей, таких как кэширование запросов и кэширование страниц.

Приведённый ниже код является типичным случаем кэширования данных, где $cache указывает на компонент кэширования:

Начиная с версии 2.0.11, компонент кэширования предоставляет метод getOrSet(), который упрощает код при получении, вычислении и сохранении данных. Приведённый ниже код делает в точности то же самое, что и код в предыдущем примере:

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

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

Note: В getOrSet() можно передать срок действия и зависимости кэша. Прочтите Срок действия кэша и Зависимости кеша чтобы узнать больше.

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

Вы можете получить доступ к компоненту кэша, используя выражение Yii::$app->cache .

Поскольку все компоненты кэша поддерживают единый API-интерфейс - вы можете менять основной компонент кэша на другой через конфигурацию приложения. Код, использующий кэш, при этом не меняется. Например, можно изменить конфигурацию выше для использования APC cache следующим образом:

Tip: Вы можете зарегистрировать несколько кэш-компонентов приложения. Компонент с именем cache используется по умолчанию многими классами (например, yii\web\UrlManager).

Yii поддерживает множество хранилищ кэша:

    : использует расширение PHP APC. Эта опция считается самой быстрой при работе с кэшем в «толстом» централизованном приложении (т.е. один сервер, без выделенного балансировщика нагрузки и т.д.); : использует таблицу базы данных для хранения кэшированных данных. Чтобы использовать этот кэш, вы должны создать таблицу так, как это описано в yii\caching\DbCache::cacheTable; : является кэшем-пустышкой, не реализующим реального кэширования. Смысл этого компонента в упрощении кода, проверяющего наличие кэша. Вы можете использовать данный тип кэша и переключиться на реальное кэширование позже. Примеры: использование при разработке; если сервер не поддерживает кэш. Для извлечения данных в этом случае используется один и тот же код Yii::$app->cache->get($key) . При этом можно не беспокоиться, что Yii::$app->cache может быть null ; : использует обычные файлы для хранения кэшированных данных. Замечательно подходит для кэширования больших кусков данных, таких как содержимое страницы; : использует расширения PHP memcache и memcached. Этот вариант может рассматриваться как самый быстрый при работе в распределенных приложениях (например, с несколькими серверами, балансировкой нагрузки и так далее); : реализует компонент кэша на основе Redis, хранилища ключ-значение (требуется Redis версии 2.6.12 или выше); : использует расширение PHP WinCache (смотрите также); (deprecated): использует расширение PHP XCache; (deprecated): использует Zend Data Cache.

Tip: Вы можете использовать разные способы хранения кэша в одном приложении. Общая стратегия заключается в использовании памяти под хранение небольших часто используемых данных (например, статистические данные). Для больших и реже используемых данных (например, содержимое страницы) лучше использовать файлы или базу данных.

У всех компонентов кэша имеется один базовый класс yii\caching\Cache со следующими методами:

    : возвращает данные по указанному ключу. Если данные не найдены или устарели, то значение false будет возвращено; : сохраняет данные по ключу; : сохраняет данные по ключу если такого ключа ещё нет; : возвращает данные по указанному ключу или выполняет переданную анонимную функцию для вычисления значения, а полученные данные сохраняет в кэш и возвращает; : извлекает сразу несколько элементов данных из кэша по заданным ключам; : сохраняет несколько элементов данных. Каждый элемент идентифицируется ключом; : сохраняет несколько элементов данных. Каждый элемент идентифицируется ключом. Если ключ уже существует, то сохранения не происходит; : есть ли указанный ключ в кэше; : удаляет указанный ключ; : удаляет все данные.

Note: Не кэшируйте непосредственно значение false , потому что get() использует false для случая, когда данные не найдены в кэше. Вы можете обернуть false в массив и закэшировать его, чтобы избежать данной проблемы.

Некоторые кэш-хранилища, например, MemCache или APC, поддерживают получение нескольких значений в пакетном режиме, что может сократить накладные расходы на получение данных. Данную возможность возможно использовать при помощи multiGet() и multiAdd(). В случае, если хранилище не поддерживает эту функцию, она будет имитироваться.

Так как yii\caching\Cache реализует ArrayAccess - следовательно компонент кэша можно использовать как массив:

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

Вы можете использовать строку или произвольное значение в качестве ключа кэша. Если ключ не строка, то он будет автоматически сериализован в строку.

Обычно ключ задаётся массивом всех значимых частей. Например, для хранения информации о таблице в yii\db\Schema используются следующие части для ключа:

Как вы можете видеть, ключ строится так, чтобы однозначно идентифицировать данные таблицы.

Если одно хранилище кэша используется несколькими приложениями, стоит указать префикс ключа во избежание конфликтов. Сделать это можно путём настройки yii\caching\Cache::keyPrefix:

Для обеспечения совместимости должны быть использованы только алфавитно-цифровые символы.

Элементы данных, хранимые в кэше, остаются там навсегда и могут быть удалены только из-за особенностей функционирования хранилища (например, место для кэширования заполнено и старые данные удаляются). Чтобы изменить этот режим, вы можете передать истечение срока действия ключа при вызове метода set(). Параметр указывает на то, сколько секунд элемент кэша может считаться актуальным. Если срок годности ключа истёк, get() вернёт false :

Начиная с версии 2.0.11 вы можете изменить значение по умолчанию (бесконечность) для длительности кэширования задав defaultDuration в конфигурации компонента кэша. Таким образом, можно будет не передавать значение duration в set() каждый раз.

В добавок к изменению срока действия ключа элемент может быть признан недействительным из-за изменения зависимостей. К примеру, yii\caching\FileDependency представляет собой зависимость от времени изменения файла. Когда это время изменяется, любые устаревшие данные, найденные в кэше, должны быть признаны недействительным, а get() в этом случае должен вернуть false .

Зависимости кэша представлены в виде объектов потомков класса yii\caching\Dependency. Когда вы вызываете set() метод, чтобы сохранить элемент данных в кэше, вы можете передать туда зависимость.

Ниже приведен список доступных зависимостей кэша:

    : зависимость меняется, если любая зависимость в цепочке изменяется; : зависимость меняется, если результат некоторого определенного SQL запроса изменён; : зависимость меняется, если результат определенного PHP выражения изменён; : зависимость меняется, если изменилось время последней модификации файла; : Связывает кэшированные данные элемента с одним или несколькими тегами. Вы можете аннулировать кэширование данных элементов с заданным тегом(тегами) по вызову. yii\caching\TagDependency::invalidate();

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

Кэширование запросов требует DB connection действительный cache компонента приложения. Предпологая, что $db это yii\db\Connection экземпляр, простое использование запросов кэширования происходит следующим образом:

Кэширование запросов может быть использовано как для DAO, так и для ActiveRecord:

Info: Некоторые СУБД (например, MySQL) поддерживают кэширование запросов любого механизма на стороне сервера БД. КЗ описано разделом выше. Оно имеет безусловное преимущество, поскольку, благодаря ему, можно указать гибкие зависимости кэша и это более эффективно.

Для очистки всего кэша, вы можете вызвать yii\caching\Cache::flush().

Также вы можете очистить кэш из консоли, вызвав yii cache/flush .

  • yii cache : отображает список доступных кэширующих компонентов приложения
  • yii cache/flush cache1 cache2 : очищает кэш в компонентах cache1 , cache2 (можно передать несколько названий компонентов кэширования, разделяя их пробелом)
  • yii cache/flush-all : очищает кэш во всех кэширующих компонентах приложения
  • yii cache/flush-schema db : очищает кеш схемы базы данных для данного компонента соединения

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

Кэширование запросов имеет три глобальных конфигурационных параметра через yii\db\Connection:

    : включить или выключить кэширование запросов; По умолчанию true . Стоит отметить, что для использования кэширования вам может понадобиться компонент cache, как показано в queryCache; : количество секунд кэширования результата. Для бесконечного кэша используйте 0 . Именно это значение выставляется yii\db\Connection::cache(), если не указать время явно; : ID компонента кэширования. По умолчанию 'cache' . Кэширования запросов работает только в том случае, если используется компонент приложения кэш.

Вы можете использовать yii\db\Connection::cache(), если у вас есть несколько SQL запросов, которые необходимо закэшировать:

Любые SQL запросы в анонимной функции будут кэшироваться в течение указанного промежутка времени и с помощью заданной зависимости. Если результат запроса в кэше актуален, запрос будет пропущен, и вместо этого из кэша будет возвращен результат. Если вы не укажете параметр '$duration' , то значение queryCacheDuration будет использоваться вместо него.

Иногда в пределах "cache()" вы можете захотеть отключить кэширование запроса. В этом случае вы можете использовать yii\db\Connection::noCache().

Если вы просто хотите использовать кэширование для одного запроса, вы можете вызвать yii\db\Command::cache() при построении команды. Например:

Вы также можете использовать yii\db\Command::noCache() для отключения кэширования запросов для одной команды. Например:

Кэширование запросов не работает с результатами запросов, которые содержат обработчики ресурсов. Например, при использовании столбца типа BLOB в некоторых СУБД, в качестве результата запроса будет возвращен указатель на ресурс для этого столбца данных.

Некоторые кэш хранилища имеют ограничение в размере данных. Например, Memcache ограничивает максимальный размер каждой записи до 1 Мб. Таким образом, если результат запроса превышает этот предел, данные не будут закэшированы.

Читайте также: