Жизненный цикл запроса
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
На этом этапе происходит подготовка к выполнению страницы. Система подключает необходимые для работы ядра файлы и устанавливает соединение с базой данных. Здесь также определяется текущий сайт и его настройки, инициализируются общие функции и обработчики событий.
Ключевые процессы инициализации в служебной части пролога.
-
Подключение служебных файлов с основными библиотеками (
/lib/loader.php), автозагрузкой классов (/include/autoload.php) и глобальными функциями (/tools.php). -
Подключение
php_interface/dbconn.phpиз/local/, а если его нет — из/bitrix/. Файл сохраняет настройки совместимости и отладки$DBDebug,$DBDebugToFile. Затем ядро подключает/include/constants.php. Параметры соединения с базой данных ядро берет из секцииconnectionsв файле.settings.php. Подробнее читайте в статье Настройки. -
Создание объекта
$DBклассаCDatabaseдля совместимости со старым API. Соединение с базой данных обеспечивает ядро D7. -
Подключение
/local/php_interface/after_connect_d7.phpпосле установления соединения с базой данных, а если файла нет —/bitrix/php_interface/after_connect_d7.php. Это стандартный путь для основного соединения, если в его настройках не задан другой файл черезinclude_after_connected. -
Определение текущего сайта. На данном этапе определяется
$APPLICATION, константыSITE_ID, LANGUAGE_ID, SITE_CHARSET, SITE_SERVER_NAMEи другие. Если к этому моменту определена константа с кодом сайтаSITE_ID, то сайт не будет определяться по текущей папке и доменному имени, а все остальные константы будут определены для этого сайта. -
Подключение общего файла
/local/php_interface/init.php, а если его нет —/bitrix/php_interface/init.php. Затем ядро подключает/local/php_interface/ID сайта/init.php, а если его нет —/bitrix/php_interface/ID сайта/init.php. Из каждой пары ядро выбирает один файл. -
Открытие сессии. Объявление всех сессионных переменных (
$_SESSION). -
Выполнение события
OnPageStart. -
Создание объекта
$USER, проверка и авторизация пользователя. -
Определение шаблона сайта (
SITE_TEMPLATE_ID). -
Выполнение события
OnBeforeProlog. -
Проверка прав доступа. В случае если прав недостаточно, выводится форма авторизации и страница завершает выполнение.
-
Начало буферизации вывода.
-
Выполнение события
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-контроллер.
Основные процессы визуальной части пролога:
-
Проверка параметра «Закрытие публичной части» из настроек главного модуля.
-
Загрузка шаблона сайта (
/bitrix/templates/ID шаблона сайта/header.php). -
Выполнение события
OnFileRewrite.
Сформировать контент
В этой части происходит основная работа с контентом, который отображается для пользователя. Это центральная часть страницы, где размещается HTML-код, PHP-скрипты и другие элементы, необходимые для отображения информации и взаимодействия с пользователем.
Здесь может происходить:
-
отображение контента — вывод текстов, изображений, видео и других медиафайлов.
-
взаимодействие с пользователем — формы для ввода данных, кнопки и другие элементы интерфейса.
-
выполнение бизнес-логики — обработка данных, выполнение вычислений, взаимодействие с базой данных.
-
подключение компонентов — использование готовых модулей и компонентов для добавления функциональности: каталоги товаров, новостные ленты и так далее.
Подключить подвал
Визуальная часть эпилога — файл /bitrix/modules/main/include/epilog_before.php
На этом этапе подключаются элементы, которые завершают визуальное оформление страницы, такие как подвал сайта. Это помогает завершить структуру страницы и добавить необходимые элементы интерфейса.
Этап пропускается при обработке запроса через AJAX-контроллер.
Ядро подключает footer.php из текущего шаблона сайта.
Очистить ресурсы
Служебная часть эпилога — файл /bitrix/modules/main/include/epilog_after.php
На завершающем этапе происходит окончательная обработка страницы. Система завершает буферизацию и работу приложения. Это важно для завершения всех процессов и освобождения ресурсов.
Основные процессы служебной части эпилога.
-
Выполнение события
OnEpilog. -
Завершение буферизации страницы в
CMain::EndBufferContent(). На этом этапе ядро добавляет HTML для распространения cookie между доменами и выполняет событиеOnEndBufferContent. -
Отправка ответа клиенту. Метод
Application::end()вызываетResponse::send()и переходит к завершению приложения черезApplication::terminate(). -
Выполнение события
OnAfterEpilog. -
Запуск фоновых задач, в том числе проверки агентов
CAgent::CheckAgentsи отправки почтовых событий\Bitrix\Main\Mail\EventManager::checkEvents, если они включены в настройках. Ядро регистрирует эти задачи при инициализации приложения и выполняет их вApplication::terminate(). Подробнее читайте в статье Агенты и фоновые задачи. -
Завершение работы с кешем и закрытие соединений с базой данных.
В обработчиках OnAfterEpilog ответ уже отправлен клиенту. Для изменения HTML используйте OnEndBufferContent, для других изменений ответа выбирайте этап до вызова Application::end().