1. Об агентах
Агенты в терминологии Битрикс это технология, с помощью которой можно запускать произвольные PHP функции с заданной периодичностью. Например, импорт/экспорт, формирование отчетов, обработка различных сущностей в CRM, либо еще какие-то действия.
1.1. Периодические и непериодические агенты
Агенты в Битрикс могут быть "периодические" и "непериодические" и разделяются они по значению параметра «Периодичность выполнения»:
через заданный интервал – Непериодические;
точно в указанное время – Периодические.
1.2. Как запускаются агенты
Есть два способа для запуска агентов, на хитах пользователей или на cron задании.
- Хит – обращение посетителя к веб-сайту или серверу. Каждый раз, когда кто-то открывает страницу ресурса разработанного на Битрикс, отправляет запрос или выполняет какое-либо действие, это считается хитом. Хиты могут включать загрузку веб-страниц, изображений, файлов, выполнение скриптов и т. д.
- Cron — это стандартный инструмент для планирования выполнения задач в UNIX-подобных операционных системах, таких как Linux. Он позволяет запускать команды или сценарии автоматически в определенное время, либо периодически в соответствии с расписанием, заданным пользователем. С помощью cron можно выполнять различные задачи, такие как резервное копирование данных, автоматическая обработка файлов, формирование и отправка отчетов в чат и т. д.
По умолчанию в Битрикс агенты выполняются на хитах пользователей.
1.3. Производительность
Чем чаще агент выполняется, тем больше он может нагружать систему. Например, агент, запускаемый каждые 30 минут, будет более нагружать сервер, чем тот, который выполняется один раз в сутки. Агенты, которые занимают более 10 секунд на выполнение, считаются "тяжелыми" и могут серьезно снижать производительность. Если агенты запускаются на каждом хите и допустим ночью посещаемость невелика, то в моменте может накопиться большое количество агентов, что замедлит ответ системы на запрос следующего посетителя ресурса и он получит не самые быстрые секунды по загрузке страницы.
2. Решение по переводу непереодических агентов на cron
2.1. Переходим на страницу "Настройки > Инструменты > Командная PHP-строка" и исполним следующий код:
COption::SetOptionString("main", "agents_use_crontab", "Y"); echo COption::GetOptionString("main", "agents_use_crontab", "N");
В результате выполнения должно вывестись "Y". С этого момента на хитах будут выполняться только периодические агенты.
2.2. Что бы непериодические агенты выполнялись на cron, в крон необходимо добавить команду на выполнение, к примеру:
* * * * * /usr/bin/php -f /home/bitrix/www/bitrix/modules/main/tools/cron_events.php
Где:
* * * * *
- означает раз в минуту.
/bitrix/modules/main/tools/cron_events.php
– Файл в Битрикс по умолчанию для cron.
<?php //bitrix/modules/main/tools/cron_events.php $_SERVER['DOCUMENT_ROOT'] = realpath(__DIR__ . '/../../../..'); $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); 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(); ?>
В самом начале этого файла установлена константа define("BX_CRONTAB", true)
, а в прологе устанавливается другая константа define("BX_CRONTAB_SUPPORT", true)
. В результате данный крон-скрипт обрабатывает ТОЛЬКО непериодические агенты.
2.3. Настройка файла для cron «1С-Битрикс: Веб-окружение» (BitrixEnv)
Команду на выполнение нужно записывать в специальный файл для cron. В окружении BitrixEnv данный файл создаётся автоматически при включении cron для сайта при его создании или через меню BitrixEnv (6. Configure pool sites > 3. Change cron tasks on site).
Созданный файл лежит в директории etc/cron.d/
и имеет название bx_dbName
, где dbName
- имя базы данных сайта. Для каждого сайта создается свой файл.
Для сайта default
(директории /home/bitrix/www
), если cron не включен в данных настройках выше, задание для cron все равно выполнятся, и оно прописано в файле /etc/crontab
.
В результате непериодические агенты будут запускать на cron, периодические и отправка почтовых событий на хитах.
3. Решение по переводу всех агентов на cron, отправку почты оставляем на хитах
3.1. Вначале полностью отключим выполнение агентов на хите. Для этого выполним следующую команду в php консоли Настройки > Инструменты > Командная PHP-строка:
COption::SetOptionString("main", "agents_use_crontab", "N"); echo COption::GetOptionString("main", "agents_use_crontab", "N"); COption::SetOptionString("main", "check_agents", "N"); echo COption::GetOptionString("main", "check_agents", "Y");
В результате выполнения должно вывестись "NN".
3.2. Далее проверим, чтобы в файле /php_interface/dbconn.php
не было установленных констант:
define("BX_CRONTAB_SUPPORT", true); - Опция, которая влияет на выбор агентов в функции CheckAgents define("BX_CRONTAB", true); - Опция запрещает выполнение агента в прологе define("NO_AGENT_CHECK", true); - Опция отключает выполнение всех агентов (если они на хите работают) define("DisableEventsCheck", true); - Запрет обработки отправки писем на хите. Письма должны работать по cron, если cron не настроить, то письма не будут отправляться!
Если такие есть, удаляем или закомментируем (символ #).
3.3. Создаем свой файл /bitrix/php_interface/cron_events.php
Файл создаем по примеру системного файла /bitrix/modules/main/tools/cron_events.php
(см п. 2.2) с тем отличим, что добавляем команду на запуск агентов CAgent::CheckAgents()
, а также переносим определение константы define("BX_CRONTAB", true)
после команды на запуск агентов.
Команда CEvent::CheckEvents()
на отправку писем по крон прописывается опционально, так как отправку писем оставили на хитах.
<?php //bitrix/php_interface/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_NO_ACCELERATOR_RESET', true); define('BX_WITH_ON_AFTER_EPILOG', true); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); @set_time_limit(0); @ignore_user_abort(true); CAgent::CheckAgents(); // Выполнятся все агенты: переодические и непереодические CEvent::CheckEvents(); // Почтовые события отправляются на хитах, но и так же здесь define("BX_CRONTAB", true); 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(); ?>
При вызове данного файла будут выполнять как переодические так и непереодические агенты.
3.4. Пропишем команду для cron на выполнение нашего файла
* * * * * /usr/bin/php -f /home/bitrix/www/bitrix/php_interface/cron_events.php
Где:
* * * * *
- означает раз в минуту.
/bitrix/php_interface/cron_events.php
– Свой файл для крон
3.4.1. Настройка файла для cron на «1С-Битрикс: Веб-окружение» (BitrixEnv).
В дополнение к операциям по п.2.3 по включению крона для сайта в веб-окружение Bitrix, необходимо в специальном файле для cron, расположенном в директории etc/cron.d/
, прописать свой файл на выполнение для cron.
К примеру в файле /etc/cron.d/bx_dbdev24
вместо
…/bitrix/modules/main/tools/cron_events.php
Необходимо внести
…/bitrix/php_interface/cron_events.php
Все остальное в файле остается без изменений.
Примечание: Если у вас настроено регулярное резервное копирование «с агентами на cron» и создания резервной копии занимает продолжительное время, то на время создания резервной копии файл крона не будет повторно запускаться и соответственно не будут запускаться агенты на крон. В данном случае рекомендуется настроить запуск резервного копирования «через облачный сервис "1С-Битрикс"» или настроить запуск создания резервной копии отдельным заданием на крон.
В результате все агенты периодические и непериодические будут запускать на cron, а отправка почтовых событий будет выполняться сразу на хитах пользователей.