Дабы не плодить новых тем, задам свой вопрос в этой, тем более отметились здесь гуру скрипта. Есть какие-либо эффективные способы отладки выполнения функций агентов? Поясню. Аналогично автору темы пытался выяснить причину сбоя агента (единственным внешним признаком было отсутствие обновления времени следующего запуска). Удалось-таки выловить ошибку - лишний параметр в CIBlockSection::Update, однако никаких сообщений об ошибке не было. Отсюда и вопрос.
У меня локально агент отработал раз 10 и внезапно перестал. Время запуска давно прошло, интервал 10 сек. Как обычно, пришлось лезть в кишки битрекса -__- Агенты для запуска выбираются в месте bitrix/modules/main/classes/mysql/agent.php:121
Код
$agents_array[] = $db_result_agents_array;
смотрим этот массив и попал ли наш агент в него
Код
print_r($agents_array); die;
Если нет - то находим наш агент в таблице `b_agent` и удаляем у него `DATE_CHECK`
Так же если не запускаются агенты, то может нужно удалить из /bitrix/php_interface/dbconn.php установку константы
Код
define('BX_CRONTAB_SUPPORT', true);
Если всё равно не запускаются - изменить в таблице `b_option` у записи с NAME `check_agents` на `Y`.
Изначально проверить пытаются ли вообще запуститься можно в файле bitrix/modules/main/include.php:259
Всё это относится к агентам, отрабатываемым по хитам. Может быть по крону тоже, не проверял. У меня вышло так - на сервере они работают на кроне, настраивал не я, а локально не хочу заморачиваться с кроном, решил сделать на хитах, и вот пришлось решать почему не работают... Про `check_agents` спасибо https://pai-bx.com/wiki/1c-bitrix/2327-return-agents-on-hits/
До этого бывало сталкивался пару раз с тем, что агент переставал работать. Я начинал копаться почему, но потом он внезапно начинал работать и я успокаивался. Видимо это было связано именно с `DATE_CHECK`, ибо в этот раз она почему-то стояла где-то на полчаса больше -___- Почему-то так сильно много ибо в коде она сама иногда выставляется на 10 мин.
Код
$strSql = "UPD ATE b_agent SE T DATE_CHECK=DATE_ADD(IF(DATE_CHECK IS NULL, now(), DATE_CHECK), INTERVAL 600 SECOND)
Выяснилось что `DATE_CHECK` остаётся если произошла какая-то ошибка! Приходится вручную удалять её -___-
Для удобства, для меня проще был узнать отрабатывает агент или нет - создавать файл в той же директории что и сам скрипт запуска агента, сделал так:
Код
$sdir = dirname(__FILE__);
file_put_contents($sdir .'/'. date('H.i.s'). '.txt', ''); # название файла содержит час, минуту и секунду сработанного агента
У меня подобная ошибка, только немного по другому выражена. Не отрабатывают новые агенты, которые я создаю, а ранее созданные работают нормально. Просто для теста создал пустую функцию в init.php
Код
function newFunc() { return "newFunc();"; }
и создал на неё агент. В итоге в перехватчике BX_AGENTS_LOG_FUNCTION получил ошибку "call to undefined function newFunc()".
В init.php есть функции и для других агентов и они работают нормально, без этой ошибки. Отключал zend и удалял все папки кеша из bitrix, после чего создавал агент по новой, не помогло. Рабочих агентов 85 штук, т.е. лимит в 100 агентов заданный настройкой agents_limit я не превышаю.
Разместил функцию в файле ядра \bitrix\modules\main\classes\mysql\agent.php и новый агент работает стабильно. Т.ч. корректирую вопрос, почему init.php подключается выборочно, для одних агентов есть, а для других нет?
Разобрался, симлинк на папку local не создан, а крон запускает функции из мастер-копии, где физически эти папки расположены. Поэтому изменения в init.php и не видит.