Виды кеша:
В новом API D7 в Битрикс появился замечательный класс Bitrix\Main\Data\Cache. Он позволяет кешировать HTML вывод и переменные, пример работы с классом:
Статические методы:
\Bitrix\Main\Data\Cache::createInstance() создает объект для последующей работы не статических методов\Bitrix\Main\Data\Cache::clearCache($initDir) очищает кеш в папке /bitrix/cache/$initDirНе статические методы:
$cache->initCache($TTL, $uniqueString, $initDir = false, $baseDir = "cache") — инициализация кеша, проверяет существование кеша, вычитывает данные:$TTL время жизни в секундах$uniqueString уникальное имя$initDir папка, где будет кеш (внутри $baseDir). Если не указать, то будет браться из текущей запрошенной страницы, для каждой отдельной страницы будет создаваться новый кеш, хотя данные там одни и те же, объем кеша будет огромный, а пользы будет мало, рекомендуется всегда указывать папку$baseDir папка, внутри /bitrix, менять не рекомендуется, потому что кеш должен храниться в /bitrix/cache$cache->startDataCache($TTL = false, $uniqueString = false, $initDir = false, $vars = array(), $baseDir = "cache") начинает процесс кеширования. Дальше данные, которые выводятся в браузер, будут записываться (используется буфер вывода PHP). Все параметры как у initCache, только есть еще $vars:$TTL время жизни в секундах$uniqueString уникальное имя$initDir папка, где будет кеш (внутри $baseDir). Если не указать, то будет браться из текущей запрошенной страницы, для каждой отдельной страницы будет создаваться новый кеш, хотя данные там одни и те же, объем кеша будет огромный, а пользы будет мало, рекомендуется всегда указывать папку$vars переменные, которые сохранятся в кеш. Далее в коде переменные можно еще передать в endDataCache(). Параметр избыточный, передавать сюда данные не рекомендуется. Если вы вызывали initCache(), то параметры в startDataCache() передавать уже не стоит, вызывайте без параметров$initDir папка, где будет кеш (внутри $baseDir). Если не указать, то будет браться из текущей запрошенной страницы, для каждой отдельной страницы будет создаваться новый кеш, хотя данные там одни и те же, объем кеша будет огромный, а пользы будет мало, рекомендуется всегда указывать папку$cache->abortDataCache() останавливает кеширование$cache->endDataCache($vars = false) сохраняет кеш. $vars переменные, которые стоит сохранить. Если переменные передаются сюда, то переданные в startDataCache() игнорируются$cache->output() выводит в браузер HTML из кеша$cache->getVars() получает переменные из кеша$cache->clean($uniqueString, $initDir = false, $baseDir = "cache") удаляет кеш с именем $uniqueString в папке $initDir$cache->cleanDir($initDir = false, $baseDir = "cache") удаляет весь кеш в папке $initDirМы можем не использовать вызов $cache->output(), если работаем только с переменными. Если работаем только с HTML — так же можем не вызывать $cache->getVars().
HTML не требуется передавать в какую-то функцию, чтобы он попал в кеш, просто отдавайте в браузер. Переменные можно сохранять не только скалярные, а все, которые можно сериализовать (массивы, объекты…).
Хранение кеша по умолчанию в /bitrix/cache.
Чем больше файлов кеша в одной папке верхнего уровня, тем сильнее тормозит очистка кеша и бывает чтение. Поэтому старайтесь группировать кеш по папкам и не создавать их папки каждый раз уникальные.
В дополнение к основному классу кеширования, есть служба для установки тегов на кеш.
Рассмотрим пример с инфоблоком. Есть инфоблок Новости ID 4, данные из него выводятся на главной странице, на странице списка новостей, так же для каждой новости есть детальная страница. Это всё отдельные файлы кеша. Когда мы добавляем какую-то новость, мы не знаем кеш каких страниц надо сбросить. API инфоблока говорит сбросить кеш по тегу iblock_id_4, а к тегу уже привязаны десятки файлов, которые удаляются.
Своего кеша у taggedCache нет, теги хранятся в базе данные в таблице b_cache_tag.
Пример работы кеширования с тегами:
Очистка кеша по тегу:
$taggedCache->startTagCache($relativePath) путь, который будет очищаться при удалении кеша по тегу. Путь передавать тот же, что и в $cache->initCache()$taggedCache->endTagCache() окончание, сохраняет привязку путей к тегам в базу данных$taggedCache->abortTagCache() останавливает кеширование. Вызывать когда запущено кеширование, но оно уже не требуется$taggedCache->registerTag($tag) привязывает тег к пути кеша, указанному ранее при вызове startTagCache()$taggedCache->clearByTag($tag) очистка кеша по тегуПочему этот кеш называется управляемый — не ясно, управлять им особо не выходит. Managed cache в Битрикс это такая прослойка над обычным классом кеширования для более быстрой работы и компактного кода. Используется чаще всего для кеширования выборок отдельных таблиц.
Сразу начну с минусов:
cleanAll() управляемого кеша, удаляется так же весь кеш, на который установлены тегиПростой пример работы с классом:
В примере выше всё просто. Считываем данные, если их нет — с помощью какой-то вашей тяжелой логики генерируем, сохраняем в кеш. В следующий раз, когда данные понадобятся, если срок годности кеша еще не истечет, то получим их из кеша, сэкономив ресурсы.
Сохранение данных на диск происходит в эпилоге битрикс (заключительная часть после отработки логики страницы). Если данные большие, имеет смысл вместо функции set() использовать setImmediate(), которая сразу сохраняет данные и очищает память.
Крупные недочеты:
read(), хотя мы точно знаем что данных нет. Read() надо вызывать, потому что там устанавливается ttl, а он обязателен для сохраненияgetImmediate() требуется указывать ttl, хотя он не используется. TTL нужен только при сохранении кеша. При том TTL не хватает при вызове setImmediate(), там то он нужен. Но так как setImmediate() не принимает в параметрах TTL, перед его вызовом требуется вызов read() для указания TTL$managedCache->read($ttl, $uniqueId, $tableId = false) читает файл кеша, на случай если мы какие-то данные добавим. $ttl время жизни, $uniqueId — уникальное имя, $tableId — папка в которой сохранится файл (относительно /bitrix/managed_cache). Папку указывать не обязательно$managedCache->getImmediate($ttl, $uniqueId, $tableId = false) получение данных из кеша без предварительного считывания. $ttl — ни на что не влияет, не понятно для чего добавили его, остальное как в пункте 1$managedCache->get($uniqueId) получить данные, которые должны быть предварительно считаны с помощью read функции из пункта 1$managedCache->set($uniqueId, $val) добавление данных по имени $uniqueId. Чтобы данные добавились и сохранились, предварительно надо вызвать read из пункта 1. Значение может быть как скалярным значением, так и другим, которое можно сериализовать. Данные сохраняются на диск при подключении эпилога$managedCache->setImmediate($uniqueId, $val) установка значения с последующим моментальным сохранением данных на диск, предварительно должна быть вызвано read(). Буфер при этом очищается и если вы снова захотите работать с $uniqueId, то надо будет вызвать заново read()$managedCache->clean($uniqueId, $tableId = false) удаление кеша по имени и папке$managedCache->cleanDir($tableId) удаление всех кешей в папке$managedCache->cleanAll() удаление всего управляемого кеша. Где-то до 19 версии битрикс удаляется почему-то еще и весь тегированный кешBitrix\Main\Data\ManagedCache::finalize() сохранение данных на диск. Автоматически вызывается в эпилоге битриксаКеширование называется неуправляемым, потому что кеш не перестраивается автоматически после модификации исходных данных и действует в течение указанного времени после создания.
Неуправляемое кеширование сохраняет результаты работы ресурсоемких частей страниц в файлы. По умолчанию используется папка /bitrix/cache/, но можно задать любую другую директорию. Кеш действует определенное время и не обновляется автоматически при изменении данных.
Как работает:
Пример использования неуправляемого кеширования: