← К заметкам

Заметки

Повторный вызов обработчика 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-событий нужен учёт повторов в постоянном хранилище.