Разбор темы кэширования в компонентах CMS 1С - Битрикс по официальному вебинару.

Отложенные функции

Возможно следующая картинка не информативная.

Возможно не информативная картинка по отложенным функциям

Далее сообщается что HTML отправляется не сразу в браузер а сначала в буфер и показывают при этом следующую возможно так же не информативную картинку.

Ещё одна возможно не информативная картинка по отложенным функциям

Про начало и завершение буферизации HTML-вывода

Далее приводится ссылка 1 на странице документации для разработчиков Битрикс(главный модуль -> основные сведения -> страница и порядок её выполнения). В видео про информацию про эту ссылку рассказывается что есть пункты "Начало буфферизации вывода" и "Завершение буферизации страницы".

Событие перед выводом буферизированного HTML

Вторая ссылка которая приводится на том же слайде ведёт на документацию события OnEndBufferContent, через меню на неё можно зайти перейдя по ссылкам: главный модуль -> события -> OnEndBufferContent (с версии 7.0.1). В документации написано что событие срабатывает при выводе буферизированного контента.

Следующий листинг демонстрирует работу события перед выводом буферизированного контента, а именно должен заменять на страницах сайта одно слово на другое. В видео вебинара файл был размещён в папке /local/php_interface/include/ и назывался werinar_некоторе_цифры.php, подключался ли этот файл где либо не известно. Код из следующего листинга не тестировался.

Продолжение про отложенные функции

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

Некоторое объяснение работы отложенных функций, по факту замена работают не так

На следующем слайде приводятся 2 ссылки, а именно ссылка 2.1 и ссылка 2.2. Первая ссылка ведёт на документацию по отложенным функциям на сайте 1С Битрикс. В частности в этой документации рассказывается про алгоритм работы отложенных функций, а именно что есть стек А в котором хранятся последовательно выводимые части HTML(если я правильно понял разбитые в тех местах, в которых вызвана какая либо отложенная функция, при этогм написано что в конец каждого стека помещается пустой элемент для подстановки результата работы отложенной функии, хотя зачем он нужен если можно вставлять такие элементы между элементами стека, так же в документации приводится следующий список таких отложенных функций(то-есть при вызове которых происходит создание нового элемента стека) то-есть список методов CMain: ShowTitle, ShowCSS, ShowNavChain, ShowProperty, ShowMeta, ShowPanel) и стек Б который хранит имя и параметры соответствующих отложенных функций. В документации сообщается что результаты работы отложенных функций выводятся в прологе. Так же в документации сообщается, что не следует использовать отложенные функции в файлах result_modifier.php и template.php поскольку результаты их работы кэшируются, исключения составляют функции SetViewTarget EndViewTarget которые в таких случаях предположительно должны работать корректно. После того как очередной элемент стека создан - буфер вывода очищается и снова запускается буферизация запускается. Так же в документации написано, что в конце страницы все отложенные функции выполняются, информация из стека А конкатинируется и выводится в браузер. Возможно всё же не в конце страницы, а есть какой то конкретный метод при срабатывании которого это и происходит. Ещё в документации на этой странице возможно имеет смысл прочитать про метод AddBufferContent объекта $APPLICATION и информацию по ссылке связанную с вызовом компонента через отложенную функцию.

Ссылка 2.2 ведёт на видео урок про отложенные функции, его скринсшот приведён ниже. Этот видео-урок я ещё не смотрел.

Урок по отложенным функциям на сайте академии 1С-Битрикс

На следующем слайде в частности есть информация что "ShowViewContent" для компонентов - для передачи части шаблона компонента, а так же что можно создавать свои отложенные функции используя метод AddBufferContent класса CMain. Слайд приведён на скринсшоте ниже.

Слайд из видео разбора экзамина 2 Битрикс про ShowViewContent и AddBufferContent

На следующем скорисшоте показывается как применяются отложенные функции header.php в шаблоне сайта на 1с Битрикс, а именно у объекта $APPLICATION вызываются методы: ShowHead, ShowTitle, ShowPanel. Так же несколько раз вызывается метод того же объекта - SetAdditionalCSS, хотя наверное в данном случаи это не использование отложенной функции, а передача для её параметров(видимо в данном случаи для ShowHead). В самом видео вебинара SetAdditionalCSS перечисляется как отложенная функция.

Использование отложенных функций файле header.php шаблона сайта на 1С Битрикс

После момента на скринсшоте выше в рассматриваемом видео проговаривается, что при размещении компонентов в шаблоне требуется убирать параметры устанавливающие например значение заголовка, поскольку в этом случаи компоненты могут заменить нужный заголовок(в видео говорится именно про установку заголовка, хотя возможно есть аналогичные параметры которые так же подпадают под эту ситуацию и имеет смысл их проверить после размещения компонента), особенно это актуально для footer.php, поскольку в случаи с header.php заголовок который может быть установлен с этом файле скорее всего будет заменён корректным кодом который будет выполнен далее, хотя и в таком случаи это действие которого можно было бы не делать.

Далее рассказывается про методы класса CMain, а именно: ShowProperty, SetPageProperty, GetProperty. Вызов первого указывает место в HTML куда будет подставлено значение соответствующего свойства, которое устанавливается вызовом SetPageProperty. Так же обращается внимание что вызвав метод ShowProperty не удастся получить значение и например присвоить его переменной(даже если к моменту вызова метода значение соответствующего свойства уже установлено вызовом SetPageProperty), при этом в HTML в место вызова далее будет подставлено значение свойства и выведено браузеру, аналогично не удастся присвоить значение переменной используя вызов метода ShowTitle. Для получения значения соответствующего свойства используется метод GetProperty, который вернёт последнее установленное в настоящий момент значение, системной для получения значения например для метода ShowProperty так же используется метод GetProperty.

Использованы выше указанные методы класса CMain могут быть например следующим способом: в файле шаблона(например header.php) вызывается $APPLICATION->ShowPrperty("mytestprop"); далее например в файле некоторой страницы сайта index.php устанавливается значение соответствующего свойства вызовом $APPLICATION->SetPageProperty("mytestprop","Устанавливаемое значение"); при загрузке соответствующей страницы в HTML в месте вызова метода ShowProperty должно быть подставлено установленное значение свойства.

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

Использование своих свойств

Далее в рассматриваемом видео рассказывается как можно создавать свои свойства, управление которыми можно например предоставить контент менеджеру. Установка имён таких свойств осуществляется в административной части сайта в разделе: настройки -> настройки продукта -> настройки модулей -> управление структурой. Ниже приведён скринсшот формы в которой осуществляется изменение списка таких свойств. В рассматриваемом случаи я создал тип свойства myadmtestprop используя его можно обращаться к данному свойству например с использованием методов GetProperty и SetPageProperty, а так же установил значение названия свойства "Тестовое администрируемое свойство", это название будет отображаться на странице редактирования свойств страницы или раздела.

Управление(создание, изменение, удаление) свойствами страниц и разделов в CMS Bitrix

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

На следующем скринсшоте показана форма редактирования свойств страницы(форма редактирования раздела выглядит аналогично и отдельного скрнсшота с ней не будет), на нём так же видно новое добавленное свойство с названием "Тестовое администрируемое свойство" справа от надписи имеется поле ввода, в котором можно установить значение свойства для данной страницы.

Для того чтобы установить свойство по-умолчанию для всего сайта можно перейти на главную страницу сайта и установить свойство в форме редактирования свойств раздела, после этого на уровне файловой системы в соответствующей разделу директории в файле .section.php в переменной массива $arDirProperties будет добавлен элемент, ключ которого соответствует типу свойства, а значение - установленному значению рассматриваемого свойства.

Далее по кэшу

На 33-ей минуте утверждается что использование метода ShowProperty в кэшируемой части не работает.

До 39-ой минуты обсуждается вызов метода SetPageProperty в файле шаблона template.php и показывается что если не сбрасывать кэш то будет выведено значение рассматриваемого свойства установленное по-умолчанию, а не то которое устанавливается в файле шаблона.

На следующем скринсшоте рисунок организации кэша компонентов битрикс с 40-вой минуты видео.

Ниже приведён рисунок про кэш в компонентов в CMS bitrix с 41-ой минуты видео.

Ниже приведён следующий скринсшот организации работы кэша в компонентах битрикс с 41-ой минуты, в него добавлен файл result_mofifier.php.

И ещё один скринсшот с схемой организации кэша в битрикс с 41-ой минуты видео приведён ниже, в схему добавлен кэш.

Ниже приведён скринсшот с схемой работы кэша в компонентах битрикс с 47-ой минуты видео, в схему добавлен файл component_epilog.php.

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

На 51-ой минуте видео обращается внимание, какой именно массив $arResult содержится в component_epilog.php, имеется ввиду что этот массив может быть загружен из кэш, а не сформирован в результате выполнения соответствующих запросов и прочей обработки в кэшируемой части компонента. Для этого приводится в пример добавление в кэшируемой части компонента в запрос к инфоблоку поля DETAIL_TEXT, при повторонй загрузке страницы(из кэша) информация не обновилась, что показывает что в component_epilog.php массив $arResult может быть загружен из кэшь, после же сброса кэша на странице информация о поле DETAIL_TEXT добавилась в массив $arResult.

На 52-ой минуте видео рассказывается, что посмотреть сформированный компонентом файл кэша можно найти и просмотреть в папке bitrix/cache/сайт_например_s1/пространство_имён_компонента/компонент(возможно_есть_более_точное_название_например_id_компонента)/папка_с_коротким_именем_возможно_некоторый_hash/ещё_одна_папка_с_коротким_именем_возможно_некоторый_hash/файл_с_названием_возможно_являющийся_некоторым_hash.php пример того как может выглядеть такой файл приведён на скринсшоте ниже.

Как можно видеть из скринсшота выше файл содержит переменные даты создания и времени жизни, а так же набор сериализованных данных. Касаемо объёма кэшируемых данных - хотя в рассматриваемом выше скринсшоте количество данных в файле не очень большое(что из скоринсшота не видно), далее по ходу видео обращается внимание, что если не управлять данными которые будут кэшироваться в $arResult то при значительном объёме выборки размер файлов может быть таким что нагрузка на процессор при парсинге и дисковый накопитель(hdd/ssd) при чтении файла кэша может вырасти до такого предела, что использование кэша перестанет быть оправданным, поэтому имеет смысл помещать в кэшь только ту информацию в массиве $arResult которая потребуется для генерации страницы далее по ходу выполнения кода(в общем то это может быть актуально даже если объём данных кэшируемых по-умолчанию не большой, при этом если всё же в кэшь попадают данные которые далее использованы не будут). Как именно управлять данными которые будут закэшированны будет рассмотрено далее.

На следующем скринсшоте показана итоговая схема работы кеширования компонентов в CMS Bitrix, в видео она приводится на 53-ей минуте.

Как утверждается в видео, в кэш по-умолчанию сохраняется весь массив $arResult целиком, поскольку это требуется для обратной совместимости.

На 55-ой минуте видео утверждается, что если размер файла кэша для компонента Битрикс приближается к одному мегабайту, то-скорее всего что то сделано не правильно.

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

Включение детальной статистики кэша в CMS Bitrix из меню

Далее в видео сообщается что локальные переменные в кэше не сохраняются, поэтому те данные которые предполагается использовать в component_epilog.php необходимо сохранять в $arResult(и соответственно если применяется кэширование только определённых ключей $arResult - добавить соответствующий ключ в массив передаваемый в качестве параметра при вызове метода SetResultCacheKeys класса CBitrixComponent).

На 59-ой минуте видео рассматривается насколько можно уменьшить размер кэша, если сохранять в него только необходимые ключи $arResult, в рассматриваемом примере в него помещается только ключ "COUNT" указанного массива, для чего в коде компонента в блоке условия включения кэширования перед вызоваом $this->includeComponentTemplate(); добавлена строчка $this->SetResultCacheKeys(array("COUNT")); - в результате применения указанного метода размер кэша в рассматриваемом случаи уменьшился с 36 Кб до 1 Кб.

================

На 1 час 2 минуты как утверждается максиматьно итоговая схема работы компонента.

На 4-ой минуте обращается внимание на правило экзамена, что в кэшь компонента сохраняются значения только тех переменных, которые используются в не кэшируемой части.

На 5-ой минуте видео говорится, что если вызвать метод SetResultCacheKeys класса CBitrixComponent без параметров или передать в него пустой массив, то никакая информация из $arResult сохранена в кэшь не будет, хотя это сообщено предположительно, то-есть возможно имеет смысл проверить так ли это на самом деле.

На 5-ой минуте задают вопрос, как сделать если из массива свойст нужны только отдельные а не все, то-есть как сделать чтобы именно они были добавлены в кэшь. На это поступил ответ, что можно собрать отдельный элемент например ELEMENTS_PROPERTIES_VALUE и в него положить подмассивы с свойствами. Или например если нужны элементы свойств, которых много, при этом не требуетя из них подробное описание то создать отдельный массив в котором не будет подробного описания(фраза не совсем такая).

================

Закончил смотреть видео 1 час 7 минут 44 секунды.

Далее на 1 час 8-ой минуте, приводится слайд с 3-мя ссылками, ниже привередно описание этих ссылок:

Так же далее на 1 час 8-ой минуте приводится слайд, на котором написано что используя вызов CBitrixComponentTemolate::getComponent или обращение к $this->_component можно получить объект компонента в template.php или result_modifier.php и используя вызов метода SetResultCacheKeys доложить данные в кэш(возник вопрос корректно ли так делать и в каких ситуациях это может потребоватсья и как в таком случаи делать это корректно). В этом слайде есть ещё пункт про переменную templateData которая предназначена(согласно слайду) для передачи данных из шаблона(template.php) в component_epilog.php которая будет корректно передавать данные при использовании в том числе совместно с кэшированеим.

Далее на 1 час 9-ой минуте видео показывается как можно используя стандартный компонент списка новостей к приеру вывести из него(компонента) некоторую информацию запрашиваемую компонентом из инфоблока в файле шаблона haeder.php использя для этого отложенную функцию. Место вывода информации в файле шаблона header.php не изменилось, то есть используется код предыдущего примера(а именно вызов $APPLICATION->ShowProperty("mytext"); так что информация будет подставлена в тег p). Для решения указанной задачи в папке шаблона news.list который находится в папке local/templates/название_шаблона_сайта/components/bitrix/news.list/название_шаблона_компонента/ создаётся файл component_epilog.php в котором первой строкой подключается пролог, а далее следующий код: $need_text = $arResult["ITEMS"][0]["ACTIVE_FROM"];$APPLICATION->SetPageProperty("mytext",$need_text);. На примере этого кода показывается, что таким образом не удаётся решить задачу, то есть передать в качестве значения отложенной функции значение даты с которой первый элемент инфоблока должен быть активен, причиной этого является отсутствие в закэшированной версии $arResult ключа ITEMS. Для решения указанной задачи, можно добавить необходимые данные в кэш используя вызов SetResultCacheKeys, при этом добавляться будет не все элементы ключа ITEMS, а только одно строковое значение которое и будет передаваться отложенной функции, которое будет помещено в массив $arResult под ключом MY_INFO, для чего в result_modifier.php добавляется строчка: $arResult["MY_INFO"] = $arResult["ITEMS"][0]["ACTIVE_FROM"];. Касаемо вызова SetReultCacheKeys, для его использования требуется получить объект компонента, сначала показывается что получение объекта компонента вызовом $this->GetComponent(); в файле coponent_epilog.php привоит к ошибке, затем этот код переносится в файл кастомизируемого шаблона news.list - template.php, где объект компонента успешно удаётся получить. И в финале этот код переносится в result_modifier.php, то-есть в этом файле устанавливается значение в массиве $arResult с ключом MY_INFO кодом приведённым выше, затем получаетя объект компонента и вызовом SetResultCacheKeys к кэшу добавляется ключ MY_INFO массива $arResult, последние два действия производятся кодом: $obj_comp = $this->GetComponent();$obj_comp->SerResultChcheKeys(array("MY_INFO"));. В файле component_epilog.php остаётся только установка значения для отложенной функции. Касаемо ключей массива $arResult которые доступны в стандартном компроненте битрикс список новостей их можно посмотреть в исходном файле компонента, на следующем скринсшоте как раз приведён код этого файла.

На 18-ой минуте видео говорится что есть специальная переменная templateData используя которую можно передать данные из template.php в component_epilog.php. Указанная переменная должна корректно работать в том числе передавать данные из кэша, то-есть если при загрузке страницы используятся кэшь и загрузка файла template.php не производилась.

На 1 час 25-ой минуте приводитя слайд про функцию ShowViewContent, а именно на нём написано, что функция может быть применена, если требуется передать большой кусок html кода(так, же в скобочках написано - "нет привязки к страницам", возможно имеет смысл выяснить что имеется под этим ввиду). Так же на слайде написано что функция корректно работает при вызове в файле шаблона компонента, то-есть в файле template.php, в том числе при использовании кеширования.

Показывается страница документации с сайта битрикс для разработчиков(ссылка 4) на которой находится описание функции ShowViewContent(перейти на эту страницу используя меню можно следующим образом: главный модуль->классы->CMain->ShowViewContent). В частности на странице написано, что метод позволяет установить выводимый контент для функции AddViewContent, возможно имеет смысл изучить как именно используется функция AddViewContent совместно с ShowViewContent. Так же на данной странице документации рассказывается как передать значение отложенной функции в место вызова ShowViewContent с использованием последовательного вызова $this->SetViewTarget("некоторое_название"); и $this->EndViewTarget(); последний метод вызывается без параметров.

Так же на 1 час 25-ой минуте показывается пример использования функции ShowViewContent, а именно в файле header.php размещается вызов $APPLICATION->ShowViewContent("tut"); а в шаблоне компонента template.php вызов $this->SetViewTarget("tut"); после закрытия php идёт вывод некоторого php, после этого вызывается $this->EndViewTarget();. Ещё раз проговаривается что ShowViewContent была разработана специально для возможности работы из файла шаблона в том числе при использовании кэширования. Так же проговаривается, что когда компонент отдаёт список товаров то ли строит то ли может строить фильтр по этим товарам который затем передаётся для вывода в шаблоне, то-есть таким образом он может быть выведен не в теле страницы(возможно стоит более детально разобраться что именно имеется ввиду, проговаривается это на 1 час 25-ой и 26-ой минуте).

На 1 час 35-ой минуте был задан вопрос, можно ли как то определить место где был установлен заголовок страницы, такой функционал есть в битрикс, для этого на странице сайта в меню можно нажать кнопку SEO после чего перейти в вкладку "Управление", на ней на против надписи "текущий заголовок страницы" можно видеть сам заголовок а далее в скобках сначала пространства имён компонента из которого был установлен заголовок и через двоеточие название самого компонента установившего заголовок, как выглядит вкладка с данной информацией показано на следующем скринсшоте.

Информация о месте установки заголовка страницы в CMS Bitrix

В компоненте кэшируемый участок кода согласно информации из вебинара обёртывается примерно так: if ($this->startResultCache(false,false)) {/* код в кэшируемой части компонента*/}

Внутри блока условия успешного включения кэширования видимо при необходимости можно отключить кэширование вызовом $this->abortResultCache(); например если не удалось подключить модуль для работы с инфоблоками, как это показано в следующем листинге:

Так же видимо $this->includeComponentTemplate(); помещается в конец участка кода условия содержащего метод старта кэширования, то-есть видимо именно вызовом шаблона должен заканичваться блок условия который кэшируется.

Комментарии

Если у Вас возникли вопросы, Вы можете задать их в форме ниже. В частности если Ваш вопрос по Bitrix и что то не получается - можно спросить. Ваш e-mail не публикуется, при этом я отвечу на него если будет что то по теме. Писать необходимо для людей - избегайте сленга, пишите орфографически правильно.

Имя:
E-mail:
Текст комментария:

Вы так же можете прочитать следующие статьи: