Agents, CEventLog, CEvent - uniqcle/Bitrix GitHub Wiki

Agents

Php ф-ии, которые запускаются с заданной периодичностью (отправка писем, очистка временных разделов и т.д). Вызывается в начале загрузки страницы.

CAgent - класс для работы с функциями-агентами.

Настройки -> Настройки продукта -> Агенты

Особенности:

  • Возвращаемое значение это код, используемый при следующем запуске.
  • Не стоит размещать ресурсоемкие операции.
  • Собственные ф-ии-агенты подключаем через init.php
  • В агентах не доступна переменная $USER - ее необходимо создавать в агенте.
  • Запуск агентов можно перенести с хитов на cron. Это ускорит сайт.
Перевод агентов на crone

Для начала полностью отключим выполнение агентов на хите. Для этого выполним следующую команду в 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 определение следующих констант:

BX_CRONTABD
BX_CRONTAB_SUPPORT
NO_AGENT_CHECK
DisableEventsCheck

И добавляем

if(!(defined("CHK_EVENT") && CHK_EVENT===true))
   define("BX_CRONTAB_SUPPORT", true);

Создаем файл проверки агентов и рассылки системных сообщений /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);
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();
?>

В планировщик если через панель ISPManager

/opt/php71/bin/php -f /var/www/uniqcler/data/www/uniqcle.ru/shop-bx/bitrix/php_interface/cron_events.php
*/5 – минуты
* - часы
* - дни месяцев
* - месяцы
* - дни недели

Частота запуска CRON должна быть не чаще, чем 1 раз в 3-5 минут во избежании зависания процессов.

Примеры команд запуска агентов (скриптов) по крону для разных версий PHP:
PHP 5.3
/opt/php53/bin/php -f /var/www/ваш_логин/data/www/ваш_сайт/bitrix/modules/main/tools/cron_events.php

PHP 5.4
/opt/php54/bin/php -f /var/www/ваш_логин/data/www/ваш_сайт/bitrix/modules/main/tools/cron_events.php

PHP 5.5
/opt/php55/bin/php -f /var/www/ваш_логин/data/www/ваш_сайт/bitrix/modules/main/tools/cron_events.php

PHP 5.6
/opt/php56/bin/php -f /var/www/ваш_логин/data/www/ваш_сайт/bitrix/modules/main/tools/cron_events.php

PHP 7.0
/opt/php70/bin/php -f /var/www/ваш_логин/data/www/ваш_сайт/bitrix/modules/main/tools/cron_events.php

PHP 7.1
/opt/php71/bin/php -f /var/www/ваш_логин/data/www/ваш_сайт/bitrix/modules/main/tools/cron_events.php

PHP 7.2
/opt/php72/bin/php -f /var/www/ваш_логин/data/www/ваш_сайт/bitrix/modules/main/tools/cron_events.php

PHP 7.3
/opt/php73/bin/php -f /var/www/ваш_логин/data/www/ваш_сайт/bitrix/modules/main/tools/cron_events.php

Не забудьте увеличить количество обрабатываемых за раз событий

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

COption::SetOptionString("main", "mail_event_bulk", "20");
echo COption::GetOptionString("main", "mail_event_bulk", "5");

Log

Регистрирует различные события для последующего анализа. CEventLog::Add()

Настройки -> Инструменты -> Агенты

Module Parameters

Настройки модулей хранятся в спец. таблице. Для получения/установки значений используется класс COption

GetOptionString()
SetOptionString()
GetOptionInt()
SetOptionInt()
$email = COption::GetOptionString("main", "email_from");
echo $email;

COption::SetOptionString("main", "MY_PARAM", "Y");

Example

Проверка товаров в каталоге без цен, запись в журнал и отправка письма администратору

init.php

define('CONST_CATALOG_IBLOCK', 4);

if(file_exists($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/include/agent.php")){
    require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/include/agent.php");
}

php_interface->include->agent.php

function agentCheckProps(){
    CModule::IncludeModule('iblock');

    $resultDB = CIBlockElement::GetList(
        ['CODE' => 'ASC'],
        ['ACTIVE' => 'Y', 'IBLOCK_ID' => CONST_CATALOG_IBLOCK, 'ACTIVE' => 'Y', 'PROPERTY_HDD' =>false ],
        false,
        ['nPageSize' => 50],
        ['IBLOCK_ID', 'ID', 'NAME', 'PROPERTY_HDD']
    );

    while($rs = $resultDB->GetNextElement()){
        $arProps = $rs->GetFields();
        $arItems[] = $arProps;
    }

    //Добавляем в журнал, что есть элементы с отсутствующим св-м
    CEventLog::Add(array(
        "SEVERITY" => "INFO",
        "AUDIT_TYPE_ID" => "CHECK_PRICE", //Свое название
        "MODULE_ID" => "iblock",
        "ITEM_ID" => "",
        "DESCRIPTION" => "Нет цен для ".count($arItems)." элементов."
    ));

    if(count($arItems) > 0){
        // Получаем пользователей, кому будет отправлено письмо
        $filter = array("GROUPS_ID" => array(1));
        $rsUsers = CUser::GetList(($by="personal_country"), ($order="desc"), $filter);
        $arEmails = array();
        while($arUser = $rsUsers->GetNext()){
            $arEmails[] = $arUser['EMAIL'];
        }

        /*
        Добавляем в админке Типы почтовых событий.
        Тип события:	СHECK_CATALOG
        Создать почтовый шаблон и привязать к почтовому событию
        */

        // Метод отправки почтовых уведомлений
        if(count($arEmails) > 0){
            $arEventFields = array(
                "TEXT" => count($arItems),
                "EMAIL" => implode(" , ", $arEmails)
            );
            CEvent::Send("СHECK_CATALOG", SITE_ID, $arEventFields);
        }
    }

return "agentCheckProps();";
}
/*
Добавить агент
Модуль: main
Ф-ия агента: agentCheckProps();
Периодичность: V
Интервал: 120
*/
// добавим произвольный агент не принадлежащий ни одному модулю
CAgent::AddAgent("My_Agent_Function();");
 
// файл /bitrix/php_interface/init.php
function My_Agent_Function() {
   // выполняем какие-либо действия      сюда скрипт импорта
   return "My_Agent_Function();";
}

CEvent

$result = \Bitrix\Main\Mail\Event::send(array(
	"EVENT_NAME" => "USER_INFO",
	"LID" => "s1",
	"C_FIELDS" => array(
		"EMAIL" => "[email protected]",
		"USER_ID" => 1,
		"TEXT" => "lorem 3 ",
		"COUPON_NUMBER" => '234234324234234'
	),
	"Y", //можно не указывать
	2 //можно не указывать
));

https://tichiy.ru/wiki/otpravka-pisem-v-bitriks-na-d7-starom-yadre-i-cherez-phpmailer/

⚠️ **GitHub.com Fallback** ⚠️