Перевод агентов на cron (базовая инструкция)
Инструкция взята с сайта - https://blog.d-it.ru/dev/28/
#Подготовка
Сначала необходимо отключить выполнение агентов на хитах.
Заходим в Настройки -> Инструменты -> Консоль 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"
, тем самым подтвердив, что мы отключили выполнение агентов на хитах.
Если на сайте работает почта, выполните следующую команду в php-консоле:
COption::SetOptionString("main", "mail_event_bulk", "20");
echo COption::GetOptionString("main", "mail_event_bulk", "5");
#Настройка
Заходим в /bitrix/php_interface/dbconn.php
в корне сайта.
Находим и убираем следующие константы:
define("BX_CRONTAB_SUPPORT", true);
define("BX_CRONTAB", true);
После этого добавляем в файл dbconn.php
:
if(!(defined("CHK_EVENT") && CHK_EVENT===true))
define("BX_CRONTAB_SUPPORT", true);
Выполнение в cron-е
Нам необходимо создать скрипт, который проверяет агенты и рассылку системных сообщений. И при исполнении которого, будут выполнятся агенты.
В папке /bitrix/php_interface/
создаем файл cron_events.php
:
<?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);
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);
// CAgent::CheckAgents() вызывается два раза специально, чтобы выполнить как периодические агенты, так и не периодические.
CAgent::CheckAgents();
CEvent::CheckEvents();
if(CModule::IncludeModule('sender'))
{
\Bitrix\Sender\MailingManager::checkPeriod(false);
\Bitrix\Sender\MailingManager::checkSend();
}
CMain::FinalActions();
?>
Настройка crontab
Осталось поставить выполнение скрипта в crontab
:
* * * * * php -f <SITE-DIR>/bitrix/php_interface/cron_events.php
Где вместо * * * * *
можете поставить необходимое время выполнения.
Но нужно правильно указать путь до php (чтобы он был той же версии, что и через Apache), а также путь до сайта.
Есть скрипт, который поможет это сделать.
- Переходим в корень сайта на Битрикс (где лежит index.php).
- Скачиваем скрипт make-bitrix-cron.sh
- Запускаем.
- Если он найдет на сервере несколько php, он спросит, какой использовать, нужно выбрать тот вариант, который по версии PHP совпадает с версией PHP в Apache.
- Далее он выведет строки, которые нужно добавить в crontab, например:
SITE_WWW="/var/www/example/data/www/example.ru/public_html"
* * * * * test -f $SITE_WWW/bitrix/modules/main/tools/cron_events.php && { /opt/php71/bin/php -f /bitrix/modules/main/tools/cron_events.php; } >/dev/null 2>&1
- С помощью
crontab -e
редактируем crontab и добавляем туда эти строки.
Готово.
Почему может не работать?
Пока кратко напишу основные моменты:
- Константа BX_CRONTAB_SUPPORT в dbconn.php.
- Прописанная команда в crontab
bitrix/modules/main/tools/cron_events.php
- Агент может быть в статусе "Выполняется" (упал или долго работает), поэтому именно он может не запускаться по интервалу.
- В b_option может быть опция 'check_agents' == 'N', что отключает агентов.
- Вот тут еще несколько вещей описаны, которые могут влиять.
- Еще бывает, что раньше стояла другая версия php и после обновления забыли указать путь до php в кроне
Выполнение агентов происходит в prolog.php, а точнее в include.php (а не в tools/cron_events.php, как можно было бы подумать).
Кстати! Стоимость настройки агентов на CRON с сайта на CMS 1С-Битркис нашими специалистами - 1 400 руб.