Перевод агентов на крон, окончательная попытка

Углубленное изучение Битрикс
  • Перевод агентов на крон, окончательная попытка

    Антон Долганин 29 Декабря 2014 8:28 17993
    Уже было несколько попыток перевести агенты на крон. В одной попытке не затрагивались периодические, в другой попытке подмешивалась еще и отправка почты. В этой попытке мы остановимся исключительно на всех агентах.

    Немного ликбеза. Что такое агент в терминологии Битрикс? Это метод или функция, который выполняет определенную функцию по расписанию. Например, импорт/экспорт, очистка данных, либо еще какие-то действия.  Если такие агенты не переводить на крон (планировщик), то они будут выполняться на хитах пользователя. Это означает, что последний будет ждать выполнения агента, что увеличит время выполнения страницы, и отрицательно скажется на отношении пользователя к сайту. Поэтому, данная инструкция обязательна к применению.

    Итак, порядок действий:

    1. Из /bitrix/php_interface/dbconn.php убрать любые упоминания:
    • BX_CRONTAB
    • BX_CRONTAB_SUPPORT
    • NO_AGENT_CHECK
    • DisableEventsCheck
    2. В командной PHP-строке в админке выполнить:
    COption::SetOptionString("main", "agents_use_crontab", "N"); 
    COption::SetOptionString("main", "check_agents", "N");  


    3. Создать файл cron_events.php, и положить его в /bitrix/php_interface/, такого содержания:
    <?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', true);  
    CAgent::CheckAgents();  
    //require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/tools/backup.php');
    


    CAgent::CheckAgents() вызывается два раза специально, чтобы выполнить как периодические агенты, так и не периодические.
    Если вам требуется, чтобы данный файл отвечал еще и за бекап, откомментируйте последнюю строчку.

    В следующих статьях мы рассмотрим как добавлять задачу крон на исполнение данного файла в различных панелях управления.

    PS: Если вам нужно перевести на крон только НЕпериодические агенты, следует воспользоваться данным курсом. Отличия в подходах довольно специфичные и в 90% случаев можно не обращать на них внимания.
Антон Долганин
29 Декабря 2014 8:45
Почта остается на хитах специально, так как это статья для клиентов, и не всем понравится почта на кроне. Для перевода еще и почты рекомендую данную статью.
Пономарев Юрий
10 Января 2015 10:27
После прочтения остались вопросы.
1) Как при таком способе запуска создавать агенты?
2) Как задавать интервал выполнения агентов - интервал запуска  cron_events.php и интервал самого агента?
3) Как и с какой периодичностью запускать файл cron_events.php?
4) Чем описанный вами метод отличается от изложенного в курсе?
Часть ответов можно найти здесь, однако, раз уж есть статья, хотелось бы увидеть это в одном месте.
Антон Долганин
11 Января 2015 17:09
Юрий, спасибо за вопрос.

1. Как обычно. Нет разницы, периодические они или нет. Запускаться по крону будут и те и те.
2. Интервал запуска cron_events - лучше ставить 1 минуту. Но некоторые хостинги могут запретить такой частый запуск. Тогда от агентов по крону лучше отказаться.
Если интервал агента меньше 1 минуты (что бывает крайне редко) это не страшно. Либо переводить агенты посредством данной статьи http://dev.1c-bitrix.ru/community/blogs/oracle/215.php (тогда агенты с интервалом меньше минуты делать периодическими, и они будут выполняться на хитах).

3. Ответил выше.
4. Тоже ответил выше, но повторюсь - в моей статье на крон переводятся и периодические и не периодические агенты. В курсе переводятся только не-периодические агенты. Чтобы уже не путаться, я все собрал под одну гребенку.  
Пономарев Юрий
15 Января 2015 6:56
Антон, делаю перевод  агентов по вашей инструкции, на всякий случай спрошу - как вернут агенты на хиты?
Есть ли штатные агенты, которым, по той или иной причине, необходимо выполнятся на хитах?
Антон Долганин
20 Января 2015 5:27
Юрий, прошу прощения за длительный ответ.

Чтобы вернуть агенты обратно, необходимо:

1. Выполнить
COption::SetOptionString("main", "check_agents", "Y");

2. Убрать define константы NO_AGENT_CHECK, если он есть.

Штатные агенты - я знаю только один - отложенное удаление файлового кеша (который запускается для очистки кеша каталога при изменении элемента каталога каждую секунду). Но это только для файлового, я бы все равно рекомендовал мемкеш. Все остальные агенты имеют достаточно большой период запуска (несколько минут и более).
Герман
29 Апреля 2015 14:56
Добрый день.

Антон, подскажите пожалуйста, можно ли и как, для одного определенного агента сделать свое отдельное расписание крона.
Поясню зачем мне это надо:
Один из агентов выполняет импорт прайслиста.
Прайс лист огромный ~1,3 млн. строк. И за 10 минут не успевает загрузится весь, не то что за 1 минуту.

Мое предположение:
Создать файл аналогичный cron_events.php , но в место
CAgent::CheckAgents(); 
define('BX_CRONTAB', true); 
CAgent::CheckAgents();

Указать функцию агента.
И на этот файл создать отдельное расписания крона.
Антон Долганин
29 Апреля 2015 18:50
Мое предположение:
Герман, совершенно верно - так и надо сделать :) По другому никак.
Герман
30 Апреля 2015 10:54
Евгений
15 Октября 2015 13:59
Здравствуйте! Нам сделали модуль импорта  который работает не корректно. Не корректность заключается в том что явно не хватает времени импортировать данные. в результате картинки у многих товаров не импортируются.

Можно ли как - то  запустить импорт вручную и добиться чтобы импорт картинок прошел успешно?
Если кто не понял вопроса, то что мне нужно написать? какой скрин предоставить?
Антон Долганин
16 Октября 2015 5:33
Как понимаю, у вас импорт сделан на агенте, надо попробовать перевести именно импорт на крон. С этим вам только разработчик поможет.
Sergey Mochalov
24 Ноября 2017 10:32
Доброго дня, Антон

Зачем нужно создавать файл рядом с ини?
практически то же самое лежит тут


[root@avol vto]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed


* * * * *  bitrix test -f /home/bitrix/www/bitrix/modules/main/tools/cron_events.php && { /usr/bin/php -f /home/bitrix/www/bitrix/modules/main/tools/cron_events.php; } >/dev/null 2>&1

[root@avol vto]# cat /home/bitrix/www/bitrix/modules/main/tools/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_CRONTAB", 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");
?>