Ядро
Result, ошибки и журналирование
Проверка Result, закрытые журналы и диагностика ошибок без публикации данных CRM.
Проверять результат операции
В D7 ошибка часто возвращается внутри Result, а не выбрасывается как исключение. Приведение такого объекта к bool не проверяет успех.
<?php
$result = $operation->launch();
if (!$result->isSuccess()) {
$error_messages = $result->getErrorMessages();
// Передайте сообщения в обработчик ошибок вашего приложения.
throw new \RuntimeException('Операция не выполнена');
}$operation здесь — подготовленная операция CRM. Способ получения объекта зависит от конкретного API; произвольные методы могут возвращать другие типы.
Журнал за пределами публичного каталога
Каталог /local/logs/ сам по себе не закрыт от HTTP. Для серверной диагностики используйте журнал, доступный администратору, но не посетителю сайта. Расположение error_log задаётся настройкой PHP; проверьте его до записи данных.
<?php
error_log(json_encode([
'event' => 'crm_sync_failed',
'entity_id' => (int) $entity_id,
'error_code' => 'REMOTE_TIMEOUT',
], JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR));Записывайте тип события и технический идентификатор. Полный запрос, OAuth-ответ, вебхук и массив полей CRM в такой записи не нужны. Для Debug::writeToFile и AddMessage2Log также нужно отдельно настроить закрытое место хранения: имя метода не обеспечивает защиту файла.
Ошибки PHP в браузере и на сервере
В рабочей среде показ ошибок посетителю выключают, а запись в серверный журнал оставляют. CLI и PHP-FPM могут использовать разные конфигурации: успешный запуск из консоли не подтверждает настройки веб-процесса.
Отсутствие пользовательского сообщения после операции не доказывает, что операция не запускалась. Найдите запись веб-сервера и PHP за тот же запрос.