Выполнение страницы
Table of Contents
Теперь когда мы знаем как именно обрабатывается URI и где не нужно располагать свои публичные страницы, мы можем поговорить о самой странице.
Состав страницы
Под термином Страница в контексте данной статьи мы будем понимать физический исполняемый файл, а не контент отображаемый в браузере пользователя. И любая страница состоит из 3 составляющих:
- Шапка (
header) - Рабочая область (
workarea) - Подвал (
footer)
Пример кода страницы
Пример минималистичного кода страницы:
<?php require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); ?>
<!-- Тело страницы -->
<?php require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php"); ?>
Шапка (header)
Каждая физическая страница публичной части начинается с подключения технического файла:
<?php require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); ?>
Образно, внутри него выполняются все остальные подключения:
- Определения констант
BX_ROOTиBX_PERSONAL_ROOT - Подключение композитного кеширования
- Подключение служебной части пролога (
prolog_before.php) - Подключение визуальной части шаблона (
prolog_after.php)
Рабочая область
Или Тело страницы - это часть PHP/HTML кода он не является частью шаблона сайта и отображает индивидуальное содержимое публичной либо административной страницы.
Подвал (footer)
Каждая физическая страница публичной части заканчивается подключением технического файла:
<?php require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php"); ?>
Образно, внутри него выполняются все остальные подключения:
- Подключение визуальной части эпилога (
epilog_before.php) - Подключение служебной части эпилога (
epilog_after.php)
Порядок выполнения
Теперь когда мы знаем из чего состоит страница самое время посмотреть вглубь и понять как именно она исполняется - какие файлы подключаются и какие переменные доступы в момент тот или иной момент.
| Шаг | Описание |
|---|---|
| - | Служебная часть пролога (/bitrix/modules/main/include/prolog_before.php) |
| 1 | Подключение /bitrix/php_interface/dbconn.php. Файл содержит константы необходимые для корректной работы Битрикс24. Ранее в нем так же определялись глобальные переменные для соединения с базой данных. |
| 2 | Соединение с базой данных. В случае ошибки соединения будет подключен файл /bitrix/php_interface/dbconn_error.php. |
| 3 | Подключение /bitrix/php_interface/after_connect.php (при наличии) и /bitrix/php_interface/after_connect_d7.php (при наличии). Подключаемые файлы могут содержать операции, необходимые для выполнения сразу после соединения с БД. |
| 4 | Определение текущего сайта, переменных и констант: $APPLICATION, SITE_ID, SITE_DIR, SITE_SERVER_NAME, SITE_CHARSET, FORMAT_DATE, FORMAT_DATETIME, LANGUAGE_ID. Определяются все классы и функции Главного модуля. Если к этому моменту определена константа с кодом сайта SITE_ID, то сайт не будет определяться по текущей папке и доменному имени, а все остальные константы будут определены для этого сайта. |
| 5 | Подключение /local/php_interface/init.php или /bitrix/php_interface/init.php. Может содержать в себе инициализацию обработчиков событий, подключение дополнительных функций - общие для всех сайтов. |
| 6 | Подключение /bitrix/php_interface/<ID сайта>/init.php. Может содержать параметры, функции и классы для конкретного сайта. |
| 7 | Открытие сессии |
| 8 | Событие OnPageStart |
| 9 | Определение пользователя, авторизация пользователя, завершение сеанса, регистрация (в зависимости от параметров в запросе). Можно использовать $USER. |
| 10 | Определение текущего шаблона сайта SITE_TEMPLATE_ID |
| 11 | Событие OnBeforeProlog |
| 12 | Проверка прав доступа к физическому файлу. В случае если прав недостаточно, то выводится форма авторизации и страница завершает выполнение. |
| 13 | Начало буферизации вывода |
| 14 | Событие OnProlog |
| 15 | Визуальная часть пролога (/bitrix/modules/main/include/prolog_after.php) |
| 16 | Подключение /bitrix/templates/ID шаблона сайта/header.php |
| 17 | Тело страницы |
| 18 | Визуальная часть эпилога (/bitrix/modules/main/include/epilog_before.php) |
| 19 | Подключение /bitrix/templates/ID шаблона сайта/footer.php |
| 20 | Вызов функции CMain::ShowSpreadCookieHTML. Данная функция выводит набор невидимых IFRAME’ов используемых в Технология переноса посетителей |
| 21 | Служебная часть эпилога (/bitrix/modules/main/include/epilog_after.php) |
| 22 | Событие OnEpilog |
| 23 | Завершение буферизации страницы и вывод в поток содержимое буфера |
| 24 | Событие OnAfterEpilog |
| 25 | Выполнение фоновых работ. В том числе: проверка агентов и отправка E-Mail писем |
| 27 | Завершение соединения с базой данных |
Выполнение в фоновом режиме
Использование платформы не ограничивается простой обработкой HTTP запросов ведь достаточно распространенным действием является выполнение операций в фоновом режиме. Такие операции могут занять продолжительное время, поэтому выполнять их посредством HTTP запроса не рекомендуется. Для таких операций используют фоновые задания (background job) или консольные скрипты, которые в последствии устанавливаются в расписание планировщика задач cron.
В чем особенность работы скрипта в консоли?
Неопытные разработчики часто отождествляют работу скрипта в консоли с работой страницы в браузере однако это не так - результат который моделируется в браузере или “php-консоли” разработчика может не совпадать.
Так происходит потому что:
- В консольном скрипте нет авторизованного посетителя. Все действия выполняются от гостей
- Нет сессий и cookie, поэтому нельзя сохранить состояние между выполнениями.
- Нет серверных переменных - поэтому не следует опираться на
$_SERVERпеременные, например брать оттудаSERVER_NAME.
Пример страницы выполняющийся в фоновом режиме (например на cron):
<?php
/**
* Replace with your document root path
* @var string
*/
$_SERVER["DOCUMENT_ROOT"] = "/home/bitrix/www";
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];
define("NO_KEEP_STATISTIC", true);
define("STOP_STATISTICS", true);
define("NO_AGENT_STATISTIC", "Y");
define("NOT_CHECK_PERMISSIONS",true);
define("BX_NO_ACCELERATOR_RESET", true);
define("DisableEventsCheck", true);
define("NO_AGENT_CHECK", true);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
@set_time_limit(0);
@ignore_user_abort(true);
// Your code here
\CMain::FinalActions();
?>
Рассмотрим код данного файла страницу с точки зрения платформы.
Битрикс активно использует значения глобальной переменной $_SERVER. Эта переменная заполняется веб-сервером - промежуточным звеном между клиентом и интерпретатором php-кода. Когда мы запускаем консольный скрипт выполняя команду php -f script.php она не заполняется и остается пустой. Наиболее распространенной переменной, которая тянется сквозь всю систему является $_SERVER['DOCUMENT_ROOT']. Ее следует задавать абсолютным путем от корня веб-сервера к директории в которой находится папка bitrix.
$DOCUMENT_ROOTэто устаревшая ссылка на глобальную переменную$_SERVER["DOCUMENT_ROOT"], ее следует устанавливать на всякий случай, так как на платформе возможно использование устаревших модулей или компонентов.
Поскольку консольный скрипт является служебным, то до подключения служебной части пролога, рекомендуется произвести настройку среды:
- Выключить сбор и обработку статистики для модуля ‘Веб-аналитика’ (константы:
NO_KEEP_STATISTIC,STOP_STATISTICS,NO_AGENT_STATISTIC) - Выключить проверку прав (константа
NOT_CHECK_PERMISSIONS) - Запретить сброс кеша акселератора (константа
BX_NO_ACCELERATOR_RESET) - Не проверять агенты (
DisableEventsCheck,NO_AGENT_CHECK)
Следом происходит подключение технической части пролога, после чего для консольных скриптов рекомендуется дополнительно убрать лимит времени выполнения (set_time_limit) и отключить прерывание выполнения скрипта при отключении клиента (ignore_user_abort) поскольку эти параметры могут быть переопределены в dbconn.php.
Подготовка закончена и теперь можно писать код, который будет делать что-то полезное.
Завершающей частью скрипта является подключение технической части эпилога или специальной функций \CMain::FinalActions(); - там выполняются технические скрипты для закрытия соединения с БД, обработка фоновых заданий (background jobs), отправка push уведомлений.
Подключение технической части эпилога или завершающей функцией является необходимым для корректной работы консольного скрипта.