20  /  25

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

Просмотров: 9111 (Статистика ведётся с 06.02.2017)
Дата последнего изменения: 17.04.2018
Роберт Басыров
Сложность урока:
2 уровень - несложные понятия и действия, но не расслабляйтесь.
1
2
3
4
5
  • Если страницы часто перезаписываются
  • Переменные данные в <head>
  • Обработка ошибок
  • В теге <head> есть блок php, который проверяет специальный Cookie

  • Если страницы часто перезаписываются

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

    В папке кеша /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, и если он установлен, добавляет блок <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>

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

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