Yii2 сбросить кэш css
Самый быстрый способ повысить производительность, улучшить скорость WEB-приложений - это однозначно кэширование. Основной механизм кэширование - это отсутствие генерации данных кодом php и постоянное обращение к базе данных. Кэширование позволяет сохранить данные в установленном месте еще при первоначальном запросе и потом уже считывать их. Разработчик устанавливает место и время хранения кэша.
Далее мы описали несколько вариантов работы с кэшем, которые вы сможете применить на практике.
Общий кэш для backend и frontend.
Как принято изначально кэш в Yii2 (Advanced) сохраняется в виде файла в соответствующие папки:
Из изложенного выше понятно, что у frontend и backend собственные папки кэша и из админки удалить кэш frontenda не возможно. С помощью команды:
можно увидеть место кэширования для текущего приложения.
Для кэширования данных из другого приложения ((например из frontend удалить кэш backenda) необходимо указать общее хранилище в конфигурации для этих приложений.
Например, кэширование frontend и backend происходит в одном месте делаем следующим образом:
Дописываем строку с "cachePath":
Миграция. База данных
Есть различные места для хранения кэша. Сейчас мы рассмотрим - базу данных.
Указываем класс работающий с БД:
Для использования данного кэша, необходимо создать таблицу. Если уже используете миграцию при работе с БД, или знаете как она запускается, то вам легче будет создать данную таблицу с помощью кода ниже:
Удаление кэша автоматическое при обновлении записи в базе данных.
Когда вы вносите изменения в БД (например, редактируете пост в админке), данные в кэше теряют свою актуальность.
Зависимость (dependency) не дает гарантий сохранения данных, при изменении их, но не добавлении например. В данной ситуации к модели, в соответствии с определенной таблицей задействованной в кэшировании (виджет), необходимо подключить поведение с событиями для ActiveRecord:
при этих событиях будет удален нужных кэш. Для удаления кэша frontenda из админки, применяется общее хранилище кэша для backend и frontend (выше описано как).
Обновляем данные, которые хранятся в кэше, подключение в модели:
Элемент массива 'cache_id' = id кэша (необходимо его удалить), в указанном случае - 'CloudWidget'. Можно передавать несколько значений.
Как автоматически удалить кэш при осуществлении действий контроллера.
При выполнении действий контроллера, которые меняют актуальность файлов в кэше, необходимо настроить автоматическое их удаление. Например, удаляете пост (actionDelete()) при этом хотите файл карты сайта для поисковых служб по причине его не актуальности. Как это сделать указано в коде выше, событие - ActiveRecord. Эта модель с привязкой поведения используется и в frontend выводя те же посты, где привязка такого поведения не нужна. Исходя из этого используем вариант, который базируется на событии EVENT_BEFORE_ACTION контроллера, который нужен в backend.
Для удаления из админки кэша frontenda, используйте общее хранилище кэша для backend и frontend (об этом писали выше).
CloudWidget (файл кэша) удален.
Рассмотрим кэширование на примерах.
Фрагменты страниц и кэширование.
Область применения - вывод виджетов, при необходимости закэшировать частично страницу
Кэширование данных (значения переменной).
Кэширование запросов к БД.
Может быть применимо как для DAO, так и для ActiveRecord
Кэширование данных заключается в сохранении некоторой переменной 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. Всё, о чем не упомянуто здесь, вы можете найти по ссылкам выше.
В параметре v=1533672190 содержится временная метка последнего изменения файла. И как только браузер загрузит страницу, вместе со стилями и скриптами, далее уже эти css и js, которые имеют версию, будут сохранены в кэше браузера и всякий раз при загрузке сайта будут браться с кэша, что сократит количество запросов к серверу и время на загрузку ресурсов.
Для того, чтобы включить кэш статических файлов ресурсов css и js в yii2 нужно сделать следующее. В файле конфигурации приложения main.php или config.php в yii2 находим массив 'components' и конфиг 'assetManager', если нет, то добавляем. Пишем следующее:
Теперь в качестве версии файла будет добавлена метка времени последней модификации файла. При изменении файла метка времени будет обновлена и браузер соответственно будет "работать" с новой версией файла.
Как проверить, что ресурс кэшируется?
Для того, чтобы убедиться что кэширование файлов css и js в браузере работает можно воспользоваться инструментом разработчика в google chrome. Перейдем на вкладку network и обновим страницу целевого сайта. Далее смотрим показатели скорости загрузки каждого скрипта:Видно, что уже попало в кэш браузера.
Если кликнуть по пути кэшированного ресурса, то можно посмотреть заголовки из которых видно, что наш ресурс берется из кэша браузера.
Обратите внимание на желтый треугольник. Это не предупреждение об ошибке. Данный знак означает, что ресурс был загружен из сохраненного браузером кэша, что нам и нужно.
Таким образом мы сохранили скрипты и стили в кэше браузера и при этом если эти ресурсы будут редактироваться, то изменится временная метка версии файла и кэш в браузере будет обновлен на более актуальный на данный момент.
Приветствую!
Меня зовут Сергей. Я - автор этого блога.
Если Вам был полезен материал на моем сайте, поддержите пожалуйста мой проект, чтобы о нем узнали другие люди - кликните plizz :) на иконку в соц. сети, чтобы поделиться материалом с другими.
Буду рад в любой поддержке для развития этого сайта. Номер карты Приват Банка 5169 3600 1047 4751
Как известно, кэширование - это способ повышения производительности (скорости) 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
Читайте также: