Заметки
Повторный вызов обработчика CRM зациклился
Если обработчик обновляет ту же сделку, он может вызвать сам себя. Сначала проверьте, нужна ли запись вообще: уже установленное значение повторно сохранять незачем.
Для рекурсии в одном PHP-запросе можно использовать набор обрабатываемых ID. Ниже только оболочка: прикладная операция передаётся callback-функцией.
function runForDeal(int $deal_id, callable $operation): void {
static $running_ids = [];
if ($deal_id <= 0 || isset($running_ids[$deal_id])) {
return;
}
$running_ids[$deal_id] = true;
try {
$operation($deal_id);
} finally {
unset($running_ids[$deal_id]);
}
} Отдельный ключ на сделку позволяет не блокировать обработку другой карточки в том же запросе. finally снимает флаг и при исключении.
Эта защита не работает между запросами и серверами. Для очереди и REST-событий нужен учёт повторов в постоянном хранилище.