У битрикса есть периодически выполняемые функции — агенты.
Агенты могут запускаться
- на хитах — при каждом формировании страницы
- на крон — используя планировщик заданий линукс
Все периодические агенты — на хитах, непериодические — на cron.
Установленная bitrix VM уже имеет настроенный планировщик и агенты на cron без всякой доработки.
Управление параметрами работы этого механизма
Константы
BX_CRONTAB_SUPPORT
BX_CRONTAB
Настройки главного модуля (по умолчанию не заданы)
agents_use_crontab
check_agents
BX_CRONTAB_SUPPORT — изначально не установлена
BX_CRONTAB_SUPPORT = true — включает запуск непериодических агентов по cron. Если не установлена, при запуске через cron константа устанавливается автоматически.
BX_CRONTAB_SUPPORT = false — включает запуск всех агентов по cron.
define("BX_CRONTAB_SUPPORT", defined("BX_CRONTAB"));
BX_CRONTAB = true — признак запуска из под cron. То есть должна быть только в запускаемом по cron коде. В оригинале только в cron_events.php
agents_use_crontab = Y — запуск непериодических агентов по cron
agents_use_crontab = N (по умолчанию) — запуск всех агентов по cron
check_agents = Y (по умолчанию) — запускает агенты при каждом хите
check_agents = N — запрещает запуск всех агентов
// установка параметра
COption::SetOptionString("main", "agents_use_crontab", "N");
// удаление параметра
COption::RemoveOption("main", "agents_use_crontab")
// просмотр параметра
echo COption::GetOptionString("main", "agents_use_crontab", "N");
То есть для перевода всех агентов на cron нужно установить
BX_CRONTAB_SUPPORT = false
agents_use_crontab = N
Теперь агенты будут работать на кроне и на хитах.
В остальных случаях агенты будут распределены
Агенты есть периодические и непериодические
периодические — этот способ позволяет запустить агент точное число раз. Например, раз в день запускается агент очистки старых почтовых событий или агент с ежедневным отчетом о посещаемости сайта.
непериодические — (критично количество запусков) например, агент пересчета рейтингов запускается раз в час. Но если за сутки не было ни одного посетителя, то логичнее выполнить агент один раз и сдвинуть назначенное время следующего запуска на час вперед после запуска. В случае строго периодического агента, этот код выполнился бы все 24 раза в сутки.


Необходимо настроить планировщик заданий на выполнение скрипта /bitrix/modules/main/tools/cron_events.php
Битрикс VM уже имеет эту настойку и запускает скрипт каждую минуту
* * * * * bitrix nice /usr/bin/php -f /home/bitrix/www/local/php_interface/cron.php > /dev/null 2>&1
* * * * *— периодичность запуска (одна минута)bitrix— имя пользователя от которого производится запускnice— команда которая делает процесс «хорошим» по отношении к другим процессам, понижая его приоритет при распределении ресурсов./usr/bin/php— путь к php интерпретатору/home/bitrix/www/— корневая директория сайтаlocal/php_interface/cron.php— путь к скрипту относительно корневой директории сайта> /dev/null 2>&1— перенаправление вывода/dev/null— сюда направляется вывод (в никуда)2>&1— ошибки перенаправляются туда же
// файл /home/bitrix/www/bitrix/modules/main/tools/cron_events.php
$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/../../../..");
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS",true);
define("BX_CRONTAB", true);
define('BX_WITH_ON_AFTER_EPILOG', true);
define('BX_NO_ACCELERATOR_RESET', true);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
@set_time_limit(0);
@ignore_user_abort(true);
CEvent::CheckEvents();
if(CModule::IncludeModule('sender'))
{
\Bitrix\Sender\MailingManager::checkPeriod(false);
\Bitrix\Sender\MailingManager::checkSend();
}
require($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/main/tools/backup.php");
CMain::FinalActions();
Особенности
- Время работы скрипта не ограничено
- Нет привязки к сайту
- Нет привязки к пользователю
Рекомендации в учебнике не совсем актуальны.
https://dev.1c-bitrix.ru/support