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

Обновлено: 05.07.2024

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

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

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

Настройка кэша

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

  • Файловый кэш
  • БДКэш
  • Кэш массива
  • Кэш памяти
  • Кэш Redis

Конфигурация DbCache

Чтобы настроить Dbcache, нам сначала нужно создать таблицу кэша. Вы можете найти схему, необходимую для Dbcache, в каталоге проекта Yii2 в vendor\yiisoft\yii2\caching\migrations. Затем настройте приложение для использования Dbcache, как показано ниже:

Конфигурация Memcached

Он использует расширения PHP Memcache или Memcached.

Установка в среде Linux довольно проста. Однако в среде Windows вы, вероятно, столкнетесь с некоторыми проблемами. Вы можете использовать это учебное руководство, чтобы установить его в Windows.

Затем настройте приложение для использования Memcache, как показано ниже:

Кэш Redis

Первый шаг — установить расширение Redis для Yii. Откройте проект в консоли и выполните следующую команду:

Затем настройте приложение для использования Redis, как показано ниже:

Основное использование кэша

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

Создать/обновить кеш

Мы можем создавать и обновлять значение кеша с помощью метода set(). Он принимает четыре аргумента:

Начиная с версии 2.0.11 мы можем использовать getOrSet() для получения, вычисления и сохранения кеша. Метод сначала проверяет, существует ли ключ, если нет, он создает ключ и возвращает значение, как показано ниже:

Получить кеш

Мы можем получить значение кэша с помощью метода get(). Требуется передать ключевой аргумент.

Проверить наличие

С помощью метода exists() мы можем проверить, существует ли указанный ключ в кеше.

Удалить кеш

Мы можем удалить элемент данных, идентифицированный ключом, с помощью метода delete().

Чтобы удалить все данные из кеша, вы можете использовать метод flush().

Пример кеша

Мы собираемся использовать простой пример, чтобы сравнить время, необходимое для обработки запроса с кешем или без него. Установите проект Yii2 и следуйте инструкциям.

Создать миграцию

Создайте миграцию под названием create_posts_table с помощью приведенной ниже команды:

Откройте файл миграции, созданный в каталоге @app/migrations, и обновите его, как показано ниже:

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

Создать модель и контроллер

С помощью Gii создайте модель Posts и контроллер PostsController

Gii уже установлен и настроен для локального использования в последней версии Yii2. Для получения дополнительной информации вы можете ознакомиться с документацией.

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

Добавьте приведенный ниже метод в PostsController и используйте его для создания поддельных данных:

Тестирование ответов без кеша

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

Нажмите на конечную точку (localhost:8080/posts/index) в браузере или Postman, как показано ниже.

БЕЗ кеша< бр />

Тестирование ответов с помощью кеша

Давайте изменим метод index() для использования кэширования и посмотрим, будет ли существенная разница во времени отклика. Обновите метод, как показано ниже.

Мы используем метод getOrSet(), рассмотренный ранее. Нажмите URL еще раз и посмотрите, сколько времени это займет.

С кешем< бр />

Результаты

Из небольшого теста, проведенного на моем ноутбуке, я могу с уверенностью заключить, что время отклика при использовании большинства компонентов кеша короче по сравнению с тем, когда кеш не используется, как показано в таблице:

Без кеша

< /tr> < tr>
Попадания на сервер Время ответа
Ist 268 мс< /td>
2-й 228 мс
3-й 224 мс
4-й 152 мс
5-й 189 мс
Среднее 212 мс

С кэшем (файловым кэшем)

< /tr> < tr>
Попадания на сервер Время ответа
Ist 232 мс< /td>
2-й 206 мс
3-й 130 мс
4-й 225 мс
5-й 105 мс
Среднее 180 мс

С кэшем (DbCache)

< /tr> < tr>
Попадания на сервер Время ответа
Ist 298 мс< /td>
2-й 254 мс
3-й 198 мс
4-й 179 мс
5-й 171 мс
Среднее 240 мс

С кэшем (Memcached)

< /tr> < tr>
Попадания на сервер Время ответа
Ist 240 мс< /td>
2-й 165 мс
3-й 130 мс
4-й 109 мс
5-й 104 мс
Среднее 150 мс

С кэшем (Redis)

< /tr> < tr>
Попадания на сервер Время ответа
Ist 250 мс< /td>
2-й 112 мс
3-й 108 мс
4-й 96 мс
5-й 90 мс
Среднее 131 мс

Заключение и заключительные мысли

Разница во времени отклика невелика, когда мы используем компоненты кэша файлов и БД, но становится очень существенной, когда мы используем Redis и Memcached.

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

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

Подготовка БД

Шаг 1. Создайте новую базу данных. Базу данных можно подготовить двумя способами.

В терминале запустите mysql -u root –p

Создайте новую базу данных с помощью CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;

Шаг 2. Настройте подключение к базе данных в файле config/db.php. Следующая конфигурация предназначена для системы, используемой в настоящее время.

Шаг 3. Внутри корневой папки запустите ./yii migrate/create test_table. Эта команда создаст миграцию базы данных для управления нашей БД. Файл миграции должен появиться в папке миграции корневого каталога проекта.

Шаг 4. Измените файл миграции (в данном случае m160106_163154_test_table.php) таким образом.

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

Шаг 5. В корне проекта запустите ./yii migrate, чтобы применить миграцию к базе данных.

Кэширование Подготовка БД

Модель MyUser должна появиться в каталоге моделей.

Кэширование данных

Кэширование данных помогает хранить переменные PHP в кеше и извлекать их позже. Кэширование данных зависит от компонентов кэша, которые обычно регистрируются как компоненты приложения. Чтобы получить доступ к компоненту приложения, вы можете вызвать Yii::$app → cache. Вы можете зарегистрировать несколько компонентов кэш-приложения.

Yii поддерживает следующие хранилища кеша —

yii\caching\DbCache — использует таблицу базы данных для хранения кэшированных данных. Вы должны создать таблицу, как указано в yii\caching\DbCache::$cacheTable.

yii\caching\ApcCache — использует расширение PHP APC.

yii\caching\FileCache — использует файлы для хранения кэшированных данных.

yii\caching\DummyCache — служит заполнителем кеша, который не выполняет реального кэширования. Цель этого компонента — упростить код, который должен проверять доступность кеша.

yii\caching\MemCache — использует расширение PHP memcache.

yii\caching\WinCache — использует расширение PHP WinCache.

yii\redis\Cache — реализует компонент кеша на основе базы данных Redis.

yii\caching\XCache — использует расширение PHP XCache.

Все компоненты кэша поддерживают следующие API —

get() — извлекает значение данных из кеша с указанным ключом. Значение false будет возвращено, если срок действия данных истек/недействителен или не найден.

add() — сохраняет значение данных, идентифицированное ключом, в кеше, если ключ не найден в кеше.

set() — сохраняет значение данных, идентифицированное ключом, в кеше.

multiGet() — извлекает несколько значений данных из кеша с указанными ключами.

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

multiSet() — сохраняет несколько значений данных в кеше. Каждый элемент идентифицируется ключом.

exists() — возвращает значение, указывающее, найден ли указанный ключ в кеше.

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

delete() — удаляет значение данных, идентифицированное ключом, из кеша.

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

Кэшированные значения данных также могут стать недействительными из-за изменения зависимостей кэша –

yii\caching\DbDependency — зависимость изменяется, если изменяется результат запроса указанного оператора SQL.

yii\caching\ChainedDependency — зависимость изменяется, если изменяется любая из зависимостей в цепочке.

yii\caching\FileDependency — зависимость изменяется, если изменяется время последней модификации файла.

yii\caching\ExpressionDependency — зависимость изменяется, если изменяется результат указанного выражения PHP.

Теперь добавьте компонент кэширования в свое приложение.

Шаг 1. Измените файл config/web.php.

Шаг 2. Добавьте новую функцию actionTestCache() в SiteController.

Test Cache

Шаг 4. Если вы перезагрузите страницу, вы заметите, что дата не изменилась. Значение даты кэшируется, и срок действия кеша истечет в течение 30 секунд. Перезагрузите страницу через 30 секунд.

Кэшированное значение даты

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

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

Шаг 1. Добавьте новый метод actionQueryCaching() в SiteController.

публичная функция actionQueryCaching() < $duration = 10; $result = MyUser::getDb()->cache(function ($db) < return MyUser::find()->count(); >, $duration); var_dump ($ результат); $user = новый MyUser(); $user->name = "кэшированное имя пользователя"; $user->email = "cacheduseremail@gmail.com"; $пользователь->сохранить(); echo "========= /yii/images/query_caching.jpg" alt="Кэширование запросов" />

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

Вы можете сбросить кеш из консоли, используя следующие команды –

кеш yii — показывает доступные компоненты кэша.

yii cache/flush cache1 cache2 cache3 — очищает компоненты кэша cache1, cache2 и cache3.

yii cache/flush-all — очищает все компоненты кеша.

Шаг 3. В корне проекта вашего приложения запустите ./yii cache/flush-all.

Yii — замечательный метод \Yii::$app->cache->flush(); который сбрасывает кеш.
Но если админ на поддомене, то кеш другой и он чистит кеш админа. Не могу понять, как очистить его спереди.

  • 2 Как организовать заголовок выходного изображения в WordPress?
  • 0 Не можете понять, как использовать angularfire-multi-auth?
  • 2 Что делает команда pushd в терминале на Mac?
  • 2 Чему теперь отдать больший приоритет?
  • 4 Некоторые фреймворки предпочитают создавать веб-приложения?
  • 2 Как выбрать данные из массива info [, , . ]?
  • 0 Пример библиотеки JavaScript для полноэкранного меню?
  • 1 Чем читать двоичный файл журнала?

Это из-за FileCache? Верно?

Ну, вам просто нужно указать common/config/main.php для кеша компонента

Или где-то еще. В любую папку вообще. В противном случае по умолчанию для компонента на переднем плане будет установлен путь '@frontend/runtime/cache', а для бака, соответственно, '@backend/. ' и когда вы будете звонить с разных субдоменов, компонент попадет в разные каталоги.

Возможно есть способы получше, но как вариант могу предложить инициализировать Application instance фронта, как это реализовано в web/index.php и вызовите функцию $app->cache->flush(); В этом случае, если у вас есть что изменить в фронте кэша копирования, это все равно будет работать.

UPD: чтобы не тянуть все приложения, можно создать кеш компонентов фабрики yii-шной из конфига фронта

Пока не пришел к выводу, что лучше иметь общее хранилище, то оно очищается от бэкенда - прокомментировал westley_Weissnat 29 июля 19 в 18:41

Дальше посоветуйте правильный вариант, а пока сделайте передний контроллер, дежурный которого будет сбрасывать кеш и вызывать его из админки.

Я сказал, что посоветуете, это лучший вариант. Но паблик + токен для этого действия — достаточная защита. - прокомментировал Archibald_Effer 29 июля 19 в 18:46

Ну и еще на индексной странице поставить четкую выписку, как это сделано в методе gc() из FileCache) - прокомментировал gaetano.Boyer 29 июля 19 в 18:52

: "очистить выезд" - не понял. Вам нужно очистить при внесении изменений в интерфейс администратора, особенно в beforeAction отдельных контроллеров. - прокомментировал westley_Weissnat 29 июля 19 в 18:55

: Да есть такое =) , каждые N запускается на очистку кеша. Вы, я так понимаю "при внесении изменений в админке", не надо. - прокомментировал Archibald_Effer 29 июля 19 в 18:58

: не нужно. Но почему каждый n работает чисто? Не проще жизнь кеш поставить? - прокомментировал westley_Weissnat 29 июля 19 в 19:01

А кто вам будет чистить просроченный кеш? Я про FileCache, специализированное приложение само удалит кеш, конечно. - прокомментировал Archibald_Effer 29 июля 19 в 19:04

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

Вообще-то yii для меня чистить будет. Ставлю срок годности, но изменения в админке надо сбрасывать кеш вне зависимости от времени. - прокомментировал westley_Weissnat 29 июля 19 в 19:13

: Пока не пришел к выводу, что лучше иметь общее хранилище, то оно очищается от бэкенда — прокомментировал westley_Weissnat 29.07.19 в 19:16

: Это именно то, что «когда вы вызываете get() для извлечения элемента данных, если время его истечения истекло, метод вернет false, указывая на то, что элемент данных не найден в кеше». только при вызове get() и gc() удаляет давно используемые данные, но опять же - нужно принудительное удаление, а вариант, который я предложил, не совсем тот. - прокомментировал westley_Weissnat 29 июля 19 в 19:19

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

По-прежнему сначала записывать каталог

Определение файлового кеша

Основное использование файлового кеша

Логическая реализация файлового кеша при хранении контента

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

Чтобы унифицировать интерфейс, yii2 объединяет все типы кэширования в следующие методы.

Я думаю, что вы можете увидеть вышеупомянутые восемь методов в документах. Это действительно не сложно. Здесь важнее два метода. Они немного плохо поняты.

exists($key)
Как следует из названия, проверьте, существует ли кеш (истечение срока действия кеша = истечение срока действия). Обратите внимание на следующие моменты для этой функции

Когда объем кэшированных данных велик, быстрее использовать существующие, чем получать. Однако, если в кеше нет нативных файлов, существующие будут имитировать их. В этом случае exists не улучшит производительность get и filecache.

Exists не проверяет зависимость кеша, поэтому, если у кеша есть зависимость и зависимость изменяется, значение, которое мы получаем через get, равно false, но возможно, что exists становится истинным, что следует отметить.

getOrSet($key, Closure $closure, $duration = null, $dependency = null)
Это новый метод, добавленный в версии 2.0.11.

Таким образом, мы можем написать код кеша, который вы можете не часто видеть

Кэшировать информацию о каждом участнике, использовать использование, минимум кода.

Выше приведены 10 унифицированных методов кэширования yii2 для всех поддерживаемых кэшей. Далее мы сделаем несколько теоретических объяснений файлового кэша. Для вашего удобства мы используем режим вопросов и ответов.

Бог спросил: Бежевый, что я имею в виду, когда смотрю на документы? Помимо строки, ключи get, set и getorset также могут получить структуру данных?

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

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

Бог спросил: Да, бежевый, ты прав. Например, мой ключ = ABC. Как создать папки или файлы кеша на основе ключа при их сохранении? Как они их называют?

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

Таким образом, вы можете увидеть файл кеша, который может заставить вас обвести кружком, как показано на следующем рисунке

Сейчас это не распространяется. Но обязательно посмотрите на следующий код

Утверждение 1 создаст файл кеша 123. Bin, потому что «123» — это строка, а 123 в утверждении 2 — это число, которое создаст файл . Bin-файл после MD5 (123).

Теперь, когда вы понимаете правила именования файлов, я думаю, Боже, вы, должно быть, были сбиты с толку папками 13, 59, A3, Le. Присмотритесь, да, вы нашли…

Это первые две буквы имени файла

Поздравляем, это точное и замечательное открытие. Однако я думаю, что вы наверняка видели такой каталог кеша

Бежевый файловый кэш Dahua yii2

Каталог имеет более одного уровня, много уровней, что имеет смысл. Это может гарантировать, что в папке не будет слишком много файлов. Но как это работает?

Это просто переменное решение. Он называется уровень каталога (по умолчанию 1)

Конечно, вы также можете настроить его в кеше Интернета или в соответствии с только что найденным паролем. Если directorylevel = 3, начинайте имя файла с начала и делайте папку через каждые 2 символа (если имя файла состоит всего из 3 символов, лучше остановиться при создании второго имени).

Боже мой, теперь ты понял~

Бог спросил: Ты сказал, что я понимаю. У меня другая проблема. Например, я установил в своем модуле ключ = кэш ABC, а другие также установили ключ = кэш ABC (не то же значение, что и мой ключ). Разве это не прикрыто? Можно ли этого избежать?

Ответ северного брата: Да, вы можете использовать переменную с именем keyprefix, которая добавляет префикс к имени вашего кэш-файла и просматривает код

дайте результат следующим образом

Бежевый файловый кеш механизма кэширования Dahua yii2

На этот раз вы не боитесь увидеть, кто посмеет с вами конфликтовать.

Бог спросил: Я в основном понял. Я задам тебе еще один вопрос и вернусь в Хуагошань после того, как отвечу на него. Например, я написал $cache -> set («a», «ABC», 1000). Но когда я его получу, как Yii может узнать, истекло это 1000 секунд или нет? Я не вижу числа 1000 в файле. Где это?

Ответ северного брата: Вы правы. Это должно представить функцию PHP — touch(), которая может изменить время последней модификации файла. Когда мы выполняем $cache -> set («a», «ABC», 1000), файловый кеш Yii делает одну вещь. Посмотрите на код

Видите ли, когда мы его читаем, нам нужно только оценить, больше ли время последней модификации FILETIME («кэш-файл»), чем текущее время (), что несложно.

OMG~ Лети, лети, лети……

Но я еще не закончил~

Теперь давайте начнем с краткого рассказа о зависимости от кэша (set, add, getorset имеют этот параметр). Что это значит? Проще говоря, тайник имеет отношение к некоему Востоку. При изменении Востока происходит сбой кеша (поскольку текущее время истечения еще не наступило)

Из-за нехватки места здесь мы поговорим о зависимости от базы данных кеша. Позже мы дадим отдельную статью «Механизм кеша Beige big talk yii2», чтобы рассказать о различных зависимостях.

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

Это длинная речь ~ как первая часть «Бежевый большой разговор о механизме кэширования yii2», надеюсь, вам понравится. Какое-то время я сосредоточусь на раскрытии механизма кэширования yii2.

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