Cron в Битриксе

Антон Чуркин
Антон Чуркин
10.11.21

    Для запуска функций в заданное время, в битриксе существует технология Агентов.

    По умолчанию, агенты выполняются на хитах, то есть при каждом посещении сайта пользователем, битрикс проверяет, какие агенты пора запускать и выполняет их. У этого способа есть два недостатка — во-первых, при нерегулярном посещении агенты могут запускаться позже чем нужно. Во-вторых — тяжёлые агенты могут затормозить работу сайта. От обоих недостатков можно избавиться, если запускать агенты с помощью 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('CHK_EVENT', 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("subscribe"))

    {

          $cPosting = new CPosting;

          $cPosting->AutoSend();

    }

    ?>