На больших и не очень проектах часто возникает вопрос с переносом исполнения агентов на cron.
И правильно, зачем посетителя сайта томить ожиданием окончания очистки таблиц статистики или пересчета форумов или ожидание письма о заказе, регистрации?
Если есть возможность выполнять периодические задания на cron'е.
Cron - это демон планирования, который выполняет задачи с заданными интервалами. Эти задачи называются заданиями cron и в основном используются для автоматизации обслуживания или администрирования системы.Например, вы можете установить задание cron для автоматизации повторяющихся задач, таких как резервное копирование баз данных или данных, обновление системы последними обновлениями безопасности, проверка использования дискового пространства, отправка электронных писем, перезагрузка сервера и так далее.
Задания cron могут быть запланированы по минуте, часу, дню месяца, месяцу, дню недели или любой их комбинации.
Отключите выполнение агентов на хитах. Для этого в 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».
Далее уберите из файла /bitrix/php_interface/dbconn.php определение следующих констант:
define("BX_CRONTAB_SUPPORT", true); define("BX_CRONTAB", true);И добавьте:
if(!(defined("CHK_EVENT") && CHK_EVENT===true)) define("BX_CRONTAB_SUPPORT", true);Создайте файл проверки агентов и рассылки системных сообщений /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('CHK_EVENT', 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(); define("BX_CRONTAB_SUPPORT", true); define("BX_CRONTAB", 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();И добавьте созданный скрипт в cron:
*/5 * * * * /usr/bin/php -f /home/bitrix/www/bitrix/php_interface/cron_events.phpТеперь все агенты и отправка системных событий будут обрабатывается из под cron, раз в 5 минут. Чтобы не увеличивалась очередь отправки почтовых сообщений, можно изменить параметр отвечающий за количество почтовых событий обрабатываемых за раз. Для этого выполните в php-консоли команду:
COption::SetOptionString("main", "mail_event_bulk", "20"); echo COption::GetOptionString("main", "mail_event_bulk", "5");