Жизненный цикл запроса

HTTP-запрос проходит путь от браузера до сервера и обратно.

Bitrix Framework участвует в этом процессе: он получает запрос, определяет, как его обработать, и запускает жизненный цикл страницы.

Получить запрос

Веб-сервер принимает HTTP-запрос, который содержит метод, путь к ресурсу, версию протокола и другие заголовки.

Определить способ обработки

Настройки веб-сервера и путь запроса определяют, какой PHP-файл обработает запрос.

Если запрашиваемый PHP-файл существует, сервер передает его на выполнение напрямую. Так работают физические страницы сайта и отдельные PHP-обработчики. Статические файлы сервер отдает без запуска PHP.

Если запрашиваемый путь не соответствует существующему файлу или каталогу, сервер направляет запрос в /bitrix/urlrewrite.php или /bitrix/routing_index.php в зависимости от настроек. Первый файл обрабатывает правила перезаписи адресов, второй запускает роутинг.

Роутинг

Система ищет совпадение URL в правилах маршрутизации. Роутинг направляет запрос на нужный обработчик.

Подробную информацию читайте в статье Роутинг.

AJAX-контроллер

AJAX-контроллеры вызываются через /bitrix/services/main/ajax.php. Эта точка входа запускает нужный контроллер без роутинга, шапки и подвала сайта. Контроллер возвращает данные, которые можно использовать для обновления части страницы без полной перезагрузки.

О жизненном цикле контроллера читайте в статье Контроллеры.

Запустить жизненный цикл страницы

После того как запрос направлен на конкретную страницу, начинается ее жизненный цикл. Страница в Bitrix Framework — это PHP-файл, который состоит из трех частей. Эти части помогают управлять подключениями, настройками и отображением контента в рамках одного запроса.

Структура страницы:

  • header — пролог,

  • workarea — тело страницы,

  • footer — эпилог.

Пример стандартной страницы:

<?php require($_SERVER['DOCUMENT_ROOT'].'/bitrix/header.php'); ?>
        #WORK_AREA#
<?php require($_SERVER['DOCUMENT_ROOT'].'/bitrix/footer.php'); ?>

Если нужна страница без шаблона сайта (например AJAX-обработчик), то достаточно подключить только служебные части пролога и эпилога:

<?php require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php'); ?>
        #WORK_AREA#
<?php require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog_after.php'); ?>

Подготовить контекст

Служебная часть пролога — файл /bitrix/modules/main/include/prolog_before.php

На этом этапе происходит подготовка к выполнению страницы. Система подключает необходимые для работы ядра файлы и устанавливает соединение с базой данных. Здесь также определяется текущий сайт и его настройки, инициализируются общие функции и обработчики событий.

Ключевые процессы инициализации в служебной части пролога.

  1. Подключение служебных файлов с основными библиотеками (/lib/loader.php), автозагрузкой классов (/include/autoload.php) и глобальными функциями (/tools.php).

  2. Подключение php_interface/dbconn.php из /local/, а если его нет — из /bitrix/. Файл сохраняет настройки совместимости и отладки $DBDebug, $DBDebugToFile. Затем ядро подключает /include/constants.php. Параметры соединения с базой данных ядро берет из секции connections в файле .settings.php. Подробнее читайте в статье Настройки.

  3. Создание объекта $DB класса CDatabase для совместимости со старым API. Соединение с базой данных обеспечивает ядро D7.

  4. Подключение /local/php_interface/after_connect_d7.php после установления соединения с базой данных, а если файла нет — /bitrix/php_interface/after_connect_d7.php. Это стандартный путь для основного соединения, если в его настройках не задан другой файл через include_after_connected.

  5. Определение текущего сайта. На данном этапе определяется $APPLICATION, константы SITE_ID, LANGUAGE_ID, SITE_CHARSET, SITE_SERVER_NAME и другие. Если к этому моменту определена константа с кодом сайта SITE_ID, то сайт не будет определяться по текущей папке и доменному имени, а все остальные константы будут определены для этого сайта.

  6. Подключение общего файла /local/php_interface/init.php, а если его нет — /bitrix/php_interface/init.php. Затем ядро подключает /local/php_interface/ID сайта/init.php, а если его нет — /bitrix/php_interface/ID сайта/init.php. Из каждой пары ядро выбирает один файл.

  7. Открытие сессии. Объявление всех сессионных переменных ($_SESSION).

  8. Выполнение события OnPageStart.

  9. Создание объекта $USER, проверка и авторизация пользователя.

  10. Определение шаблона сайта (SITE_TEMPLATE_ID).

  11. Выполнение события OnBeforeProlog.

  12. Проверка прав доступа. В случае если прав недостаточно, выводится форма авторизации и страница завершает выполнение.

  13. Начало буферизации вывода.

  14. Выполнение события OnProlog.

Класс CDatabase и API D7 работают в одном запросе. Файл dbconn.php остается частью начальной загрузки для совместимости, а объект $DB использует соединение D7. Параметры подключения храните в .settings.php. Для кода после подключения используйте after_connect_d7.php. Файл after_connect.php в этой последовательности не подключается.

Защита от прямого вызова

В начале загрузки пролога файл /bitrix/modules/main/start.php определяет константу B_PROLOG_INCLUDED. В файлы init.php, шаблоны и служебные PHP-файлы, которые должны работать только после подключения пролога, добавьте проверку:

<?php

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true)
{
    die();
}

Проверка завершает выполнение файла, если его вызвали напрямую без пролога.

Файл init.php

Файл init.php — необязательный файл ранней инициализации проекта. Используйте его только для небольшого кода, который должен подключиться в прологе, например для регистрации обработчиков событий. В проектах размещайте файл в /local/php_interface/.

Основную бизнес-логику, классы, сервисы и интеграции размещайте в собственном модуле в /local/modules/.

Если код нужен только одному сайту, его можно вынести в /local/php_interface/ID сайта/init.php. Ядро выбирает этот файл по значению SITE_ID. В административном разделе без заранее заданного SITE_ID константа содержит код языка интерфейса, например ru. В этом случае ядро ищет /local/php_interface/ru/init.php, а если его нет — /bitrix/php_interface/ru/init.php.

Не размещайте в init.php весь кастомный код. Ошибка в этом файле может нарушить работу сайта на раннем этапе загрузки. Не добавляйте механизм отключения init.php через параметр URL и не запускайте сессию вручную: переменная $_SESSION на этом этапе еще недоступна.

Подключить шапку

Визуальная часть пролога — файл /bitrix/modules/main/include/prolog_after.php

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

Этап пропускается при обработке запроса через AJAX-контроллер.

Основные процессы визуальной части пролога:

  1. Проверка параметра «Закрытие публичной части» из настроек главного модуля.

  2. Загрузка шаблона сайта (/bitrix/templates/ID шаблона сайта/header.php).

  3. Выполнение события OnFileRewrite.

Сформировать контент

В этой части происходит основная работа с контентом, который отображается для пользователя. Это центральная часть страницы, где размещается HTML-код, PHP-скрипты и другие элементы, необходимые для отображения информации и взаимодействия с пользователем.

Здесь может происходить:

  • отображение контента — вывод текстов, изображений, видео и других медиафайлов.

  • взаимодействие с пользователем — формы для ввода данных, кнопки и другие элементы интерфейса.

  • выполнение бизнес-логики — обработка данных, выполнение вычислений, взаимодействие с базой данных.

  • подключение компонентов — использование готовых модулей и компонентов для добавления функциональности: каталоги товаров, новостные ленты и так далее.

Подключить подвал

Визуальная часть эпилога — файл /bitrix/modules/main/include/epilog_before.php

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

Этап пропускается при обработке запроса через AJAX-контроллер.

Ядро подключает footer.php из текущего шаблона сайта.

Очистить ресурсы

Служебная часть эпилога — файл /bitrix/modules/main/include/epilog_after.php

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

Основные процессы служебной части эпилога.

  1. Выполнение события OnEpilog.

  2. Завершение буферизации страницы в CMain::EndBufferContent(). На этом этапе ядро добавляет HTML для распространения cookie между доменами и выполняет событие OnEndBufferContent.

  3. Отправка ответа клиенту. Метод Application::end() вызывает Response::send() и переходит к завершению приложения через Application::terminate().

  4. Выполнение события OnAfterEpilog.

  5. Запуск фоновых задач, в том числе проверки агентов CAgent::CheckAgents и отправки почтовых событий \Bitrix\Main\Mail\EventManager::checkEvents, если они включены в настройках. Ядро регистрирует эти задачи при инициализации приложения и выполняет их в Application::terminate(). Подробнее читайте в статье Агенты и фоновые задачи.

  6. Завершение работы с кешем и закрытие соединений с базой данных.

В обработчиках OnAfterEpilog ответ уже отправлен клиенту. Для изменения HTML используйте OnEndBufferContent, для других изменений ответа выбирайте этап до вызова Application::end().

Следующая