Дата последнего изменения: 09.12.2024
На больших и не очень проектах часто возникает вопрос с переносом исполнения некоторых особо тяжелых агентов на Cron. Агент считается "тяжёлым", если время его выполнения более 10 минут.
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);
*/1 * * * * /usr/bin/php -f /home/bitrix/www/bitrix/modules/main/tools/cron_events.phpЗамените
/home/bitrix/www/
на свой путь к корню сайта.
<?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); 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(); ?>Замените
/home/bitrix/www/
на свой путь к корню сайта.
После этого все агенты и отправка системных событий будут обрабатывается из-под cron, раз в 1 минуту.
Чтобы не увеличивалась очередь отправки почтовых сообщений, нужно изменить параметр, отвечающий за количество почтовых обрабатываемых за раз событий. Для этого выполняем в php-консоли следующую команду:
COption::SetOptionString("main", "mail_event_bulk", "20"); echo COption::GetOptionString("main", "mail_event_bulk", "5");
Если очередной запуск cron_events.php произошёл до завершения работы ранее запущенного скрипта, то запуска агентов не произойдет и скрипт завершит свою работу (т.к. агенты блокируются на время выполнения). В данном случае обработка ничем не отличается от обработки на хите, новый хит может произойти в тот момент, когда еще не отработали агенты на предыдущем.
Как правило, скрипты, выполненные из под cron, не имеют ограничения на время исполнения. Но если в скриптах используются методы для работы с БД, то можно столкнуться с ошибкой выполнения вложенных скриптов. Для избежания этой ошибки можно подправить значение в /bitrix/php_interface/dbconn.php
:
// если скрипт выполняется кроном, то лимит подключения к БД - 600 секунд, иначе - 60 @set_time_limit(php_sapi_name() == "cli" ? 600 : 60);