Выполнение страницы

Теперь когда мы знаем как именно обрабатывается 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 уведомлений.

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