Просмотров: 114087
Дата последнего изменения: 10.10.2024
Роберт Басыров
Сложность урока:
2 уровень - несложные понятия и действия, но не расслабляйтесь.
1
2
3
4
5
Недоступно в лицензиях:
Ограничений нет
Производительность
Цитатник веб-разработчиков.
Антон Долганин: На данный момент кеширование Битрикса фактически совершенно, и не стоит изобретать своих велосипедов.
При большом объеме базы данных может возникнуть проблема производительности. Связано это со следующими причинами:
обращения к этому массиву информации на чтение или на запись порождают конкурентные запросы;
запросы сами по себе быстрые, но их такое число, что БД начинает выстраивать из них очередь;
запросы медленные и тяжёлые, и к тому же очень частые.
Именно для разгрузки наиболее загруженных как по ресурсам, так и по времени, мест, и применяют многоуровневое кеширование. Каждую из технологий кеширования можно применять для каждого компонента в отдельности, выбирая оптимальный вариант для конкретного случая.
Примечание: пока разработчик не определится со стратегией кеширования и тем, что он хочет получить от неё, слепое включение кеширования может не дать ощутимых результатов.
Если в качестве примера брать интернет-магазин, то для каждого товара будет создан файл в кеше, чтобы при следующем обращении покупателя сервер не напрягался с запросами к БД. Это и позволяет запускать магазины уровня Эльдорадо.
Кеширование
Кеширование - технология, позволяющая сохранять результаты работы редко обновляемых и ресурсоемких кусков кода (например, активно работающих с базой данных) в специальном хранилище для более быстрого доступа к ним.
Для реализации этого созданы классы:
Cache - финальный класс для кеширования PHP переменных и HTML результата выполнения скрипта.
В старом ядре есть классы:
CPageCache - класс для кеширования HTML результата выполнения скрипта;
CPHPCache - класс для кеширования PHP переменных и HTML результата выполнения скрипта.
Система Bitrix Framework включают в себя разные технологии кеширования:
Кеширование компонентов (или Автокеширование) - все динамические компоненты, которые используются для создания веб-страниц, имеют встроенную поддержку управления кешированием.
Для использования этой технологии достаточно включить автокеширование одной кнопкой на административной панели. При этом все компоненты, у которых был включен режим автокеширования, создадут кеши и полностью перейдут в режим работы без запросов к базе данных.
Неуправляемое кеширование - возможность задать правила кеширования ресурсоемких частей страниц. Результаты кеширования сохраняются в виде файлов в каталоге /bitrix/cache/ или в произвольной папке
root_directory
По умолчанию корневая папка файлового кеша — /bitrix/cache/. С версии 24.100.0 главного модуля ее можно заменить на произвольную папку 'root_directory'. Настройка параметров ядра
, заданной в .settings.php. Если время кеширования не истекло, то вместо ресурсоемкого кода будет подключен предварительно созданный файл кеша.
Кеширование называется неуправляемым, поскольку кеш не перестраивается автоматически после модификации исходных данных, а действует указанное время после создания, которое задается в диалоге Параметры компонента.
Правильное использование кеширования позволяет увеличить общую производительность сайта на порядок. Однако необходимо учитывать, что неразумное использование кеширования может привести к серьезному увеличению размера каталога /bitrix/cache/.
Управляемый кеш - автоматически обновляет кеш компонентов при изменении данных. Для часто обновляемого большого массива данных использование управляемого кеша неоправданно.
HTML кеш лучше всего включить на какой-нибудь редко изменяющийся раздел с регулярным посещением анонимных посетителей. Технология проста в эксплуатации, не требует от пользователя отслеживать изменения, защищает дисковой квотой от накрутки данных и самовосстанавливает работоспособность при превышении квоты или изменении данных. (Считается устаревшей, рекомендуется использовать технологию Композитный сайт.) В плане многосайтовости поддерживает только многосайтовость на одном домене.
Кеширование меню. Для кеширования меню применяется специальный алгоритм, который учитывает тот факт, что большая часть посетителей - это незарегистрированные пользователи.
Кеш меню управляемый и обновляется при редактировании меню или изменении прав доступа к файлам и папкам через административный интерфейс и API.
Основные настройки кеширования расположены на странице Настройки кеширования (Настройки > Настройки продукта > Автокеширование).
Примечание: В ядре D7 настройки кеширования производятся в специальном файле.
Блокирующий режим в системе кеширования
Что такое «блокирующий режим» кеширования
С версии main 24.0.0 в кешировании появился «блокирующий режим». В таком режиме:
кеш создается только одним потоком (например, хиты пользователей)
остальные потоки получают старое значение кеша, пока новое значение не будет сгенерировано
если старого значения нет, то каждый поток генерирует данные, как обычно
В ряде случаев такой подход сильно снижает нагрузку — смотрите ниже пример нагрузочного теста.
Пример нагрузочного теста
Нагрузочный тест на портале: авторизация на пустой странице и открытие страницы с компонентом списков новостей с небольшим временем жизни кеша.
В обычном режиме видим пики времени генерации, низкий общий rps и пики ошибок:
В «блокирующем режиме» видим более стабильное время генерации, более высокий rps, большее количество хитов, меньшее время генерации:
Когда работает «блокирующий режим»
«Блокирующий режим» сработает автоматически, если выполнено хотя бы одно из условий:
Кеш истек: если кеш устарел, но прошло не больше определенного времени с момента его истечения
Кеш был удален: если кеш был удален по ключу, но прошло не больше 60 секунд (это время можно настроить)
// Удаление кеша по ключу с сохранением старого значения
$cache = Bitrix\Main\Data\Cache::createInstance(['actual_data' => false]);
$cache->clean($key, $dir);
// Создание кеша с поддержкой работы со старыми ключами
$cache = Bitrix\Main\Data\Cache::createInstance(['actual_data' => false]);
Чтобы все обращения к кешу были в блокирующем режиме, укажите use_lock => true: