Agents, CEventLog, CEvent - uniqcle/Bitrix GitHub Wiki
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");
Регистрирует различные события для последующего анализа.
CEventLog::Add()
Настройки
-> Инструменты
-> Агенты
Настройки модулей хранятся в спец. таблице. Для получения/установки значений используется класс COption
GetOptionString()
SetOptionString()
GetOptionInt()
SetOptionInt()
$email = COption::GetOptionString("main", "email_from");
echo $email;
COption::SetOptionString("main", "MY_PARAM", "Y");
Проверка товаров в каталоге без цен, запись в журнал и отправка письма администратору
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();";
}
$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/