Выполнение страницы
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 уведомлений.
Подключение технической части эпилога или завершающей функцией является необходимым для корректной работы консольного скрипта.