20  /  412

Кеширование

Цитатник веб-разработчиков.

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

Производительность

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

  • обращения к этому массиву информации на чтение или на запись порождают конкурентные запросы;
  • запросы сами по себе быстрые, но их такое число, что БД начинает выстраивать из них очередь;
  • запросы медленные и тяжёлые, и к тому же очень частые.

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

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

Если в качестве примера брать интернет-магазин, то для каждого товара будет создан файл в кеше, чтобы при следующем обращении покупателя сервер не напрягался с запросами к БД. Это и позволяет запускать магазины уровня Эльдорадо.

Кеширование

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

Для реализации этого созданы два класса:

  • CPageCache - класс для кеширования HTML результата выполнения скрипта;
  • CPHPCache - класс для кеширования PHP переменных и HTML результата выполнения скрипта.

Система Bitrix Framework включают в себя разные технологии кеширования:

  • Кеширование компонентов (или Автокеширование) - все динамические компоненты, которые используются для создания веб-страниц, имеют встроенную поддержку управления кешированием.

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

  • Неуправляемое кеширование - возможность задать правила кеширования ресурсоемких частей страниц. Результаты кеширования сохраняются в виде файлов в каталоге /bitrix/cache/. Если время кеширования не истекло, то вместо ресурсоемкого кода будет подключен предварительно созданный файл кеша.

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

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

  • Управляемый кеш - автоматически обновляет кеш компонентов при изменении данных. Для часто обновляемого большого массива данных использование управляемого кеша неоправданно.
  • HTML кеш лучше всего включить на какой-нибудь редко изменяющийся раздел с регулярным посещением анонимных посетителей. Технология проста в эксплуатации, не требует от пользователя отслеживать изменения, защищает дисковой квотой от накрутки данных и самовосстанавливает работоспособность при превышении квоты или изменении данных. (Считается устаревшей, рекомендуется использовать технологию Композитный сайт.) В плане многосайтовости поддерживает только многосайтовость на одном домене.
  • Кеширование меню. Для кеширования меню применяется специальный алгоритм, который учитывает тот факт, что большая часть посетителей - это незарегистрированные пользователи.

    Кеш меню управляемый и обновляется при редактировании меню или изменении прав доступа к файлам и папкам через административный интерфейс и API.

Основные настройки кеширования расположены на странице Настройки кеширования (Настройки > Настройки продукта > Автокеширование).

Примечание: В ядре D7 настройки кеширования производятся в специальном файле.

Примеры

Пример кеширования классом CPHPCache

$cntIBLOCK_List = 10;
$cache = new CPHPCache();
$cache_time = 3600;
$cache_id = 'arIBlockListID'.$cntIBLOCK_List;
$cache_path = 'arIBlockListID';
if ($cache_time > 0 && $cache->InitCache($cache_time, $cache_id, $cache_path))
{
   $res = $cache->GetVars();
   if (is_array($res["arIBlockListID"]) && (count($res["arIBlockListID"]) > 0))
      $arIBlockListID = $res["arIBlockListID"];
}
if (!is_array($arIBlockListID))
{
   $res = CIBlock::GetList(
      Array(), 
      Array(
         'TYPE' => 'catalog', 
         'SITE_ID' => SITE_ID, 
         'ACTIVE' => 'Y', 
         "CNT_ACTIVE" => "Y", 
         "!CODE" => 'test%'
      ), true
   );
   while($ar_res = $res->Fetch())
   {
      if($ar_res['ELEMENT_CNT'] > 0)
      $arIBlockListID[] = $ar_res['ID'];
   }
   //////////// end cache /////////
   if ($cache_time > 0)
   {
         $cache->StartDataCache($cache_time, $cache_id, $cache_path);
         $cache->EndDataCache(array("arIBlockListID"=>$arIBlockListID));
   }
}

Список ссылок по теме:


33

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