21  /  26

Частая перезапись кеша и обработка ошибок

Просмотров: 55158
Дата последнего изменения: 19.08.2021
Роберт Басыров
Сложность урока:
2 уровень - несложные понятия и действия, но не расслабляйтесь.
1
2
3
4
5
Недоступно в лицензиях:
Ограничений нет

Частая перезапись страниц

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

В папке кеша /bitrix/html_pages/<domain>/ файлы перед перезаписью копируются в файлы с расширением *.delete.<microtime>. В обычном режиме, если поменялось содержание страницы, то файлы в этой папке просто перезаписываются. С технологией Композитный сайт становится доступным просмотр того, что же изменилось на странице, что вызвало необходимость переписать кеш страницы.

Сами файлы композитного кеша лежат в отдельной папке со спецсимволом в имени. То есть странице www.site.ru/catalog/laptop/asus/fp5.php будет соответствовать файл /bitrix/html_pages/www.site.ru/catalog/laptop/asus/fp5@.htm.

Типовые причины перезаписи кеша, если:

  • разработчик использует случайные идентификаторы (ID сессии, id для JS-объектов и др.). Чтобы избежать этого используйте метод компонента - $this->randString($len=6);.
  • на сайте предусмотрен разный контент с учётом конкретного браузера пользователя.
  • на странице подставляется REQUEST_URIform[action], back_url и тому подобное), т.к. site.ru/folder/ и site.ru/folder/index.php - это один файл кеша.
  • выделен не весь динамичный контент в динамичные зоны.
  • выводятся данные из сессии (id, login).
  • если используется разный контент для анонимного и для авторизованного пользователя.
  • если на страницу добавляются CSS- и JS-файлы в зависимости от пользователя.

Переменные данные в <head>

Если в динамической области есть компонент, который в ходе своей работы должен добавлять CSS, JS в <head> страницы по какому-то условию (например, по условию авторизован пользователь или нет), то такой компонент будет провоцировать постоянную перезапись кеша.

Проблема редкая, в обычном случае добавляется всегда.

В таком случае используйте метод Bitrix\Main\Page\AssetMode::setAssetMode. Этот метод всё что добавляется в head из этой динамической области вырезает (методы типа CMain::SetAdditionalCSS, CMain::AddHeadScript, CMain::ShowHeadStrings), не включает в кеш. Сведения для <head> приходят в данных динамической области и после выполнения ajax хита добавляются на страницу.

$dynamicArea = new \Bitrix\Main\Page\FrameStatic("workarea");
$dynamicArea->setAssetMode(AssetMode::STANDARD);
$dynamicArea->setStub("заглушка");
$dynamicArea->startDynamicArea();

   // Компонент, в котором добавление ресурсов непостоянно и зависит от условий
$APPLICATION->includeComponent("mycompany:mycomponent", "template", array());

$dynamicArea->finishDynamicArea(); 

Обработка ошибок

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

BX.addCustomEvent("onFrameDataRequestFail", function(response) {
  /*
     response.error = true
     response.reason - причина ошибки
     [response.url] - адрес запрашиваемой страницы
     [response.xhr] - объект XMLHttpRequest
     [response.status] - код ответа сервера
     [response.response] - ответ сервера
  */
  window.location = "/some/url/?ncc=1";
});

В теге <head> есть блок php, который проверяет специальный Cookie

В теге есть блок php, который проверяет специальный Cookie Cookie - это текстовая строка информации, которую веб-сервер передает в браузер посетителя сайта и которая сохраняется в файле на устройстве посетителя сайта. Как правило, используется для определения уникальности посетителя, времени его последнего визита, личных настроек, уникального идентификатора корзины покупок и т.д.

Подробнее...
, и если он установлен, добавляет блок <style> с нужными стилями. Генерируется новая страничка, кеш перезаписывается. В таких случаях нужно вынести эту логику в Javascript.

<head>
<script>
if (document.cookie.indexOf("my_cookie=yes") >= 0)
{
   //Устанавливаем класс для тега 
   document.documentElement.className += " has-cookie";
}
</script>
</head>

<style>
.block { display: none; }
.has-cookie .block { display: block; }
</style>

16
Курсы разработаны в компании «1С-Битрикс»

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