Отладка на боевом сайте - журналы, режим ошибок, поиск виновника
Ищем причину сбоя на работающем сайте: смотрим журналы, включаем сообщения так, чтобы их не увидели посетители, и сужаем круг подозреваемых.
Решение
Начинаем с журналов, а не с правок:
tail -100 /var/log/php-fpm/bx0-error.log | grep -iE 'fatal|error'tail -50 /home/bitrix/www/bitrix/php_interface/error.log 2>/dev/nulltail -50 /var/log/nginx/error.log# три журнала: процессы PHP, платформа и веб-сервер# время в журналах сверяют между собой: часовой пояс сервера и сайта расходятсяПричина сбоя почти всегда уже записана. Три журнала отвечают за разные слои, и привычка начинать с них экономит часы, которые иначе уходят на догадки по поведению страницы.
Включаем показ сообщений безопасно:
'exception_handling' => ['value' => [ 'debug' => true, // подробные сообщения 'handled_errors_types' => E_ALL & ~E_NOTICE & ~E_DEPRECATED, 'log' => ['settings' => ['file' => 'bitrix/modules/error.log']],]],Подробные сообщения на боевом сайте включают в журнал, а не на экран. Вывод ошибок посетителям показывает пути к файлам и куски запросов, и это подарок любому, кто как раз изучает ваш сайт.
Смотрим панель отладки на своей странице:
if ($USER->IsAdmin()) { define('BX_SHOW_STAT', true); // время работы и число запросов}// панель показывают только себе: посетителям она не нужна и мешаетПанель отладки называет время сборки страницы и число запросов к базе. Это первый инструмент при жалобе «стало медленно», и он же отличает медленный код от медленного сервера.
Сужаем круг отключением своего кода:
// /local/php_interface/init.php: комментируем подключения по одному// require __DIR__ . '/handlers/catalog.php';require __DIR__ . '/handlers/orders.php';// сбой, исчезающий после отключения файла, найден# пошаговый отладчик оставляют стенду: на боевом сайте он опасенСвои обработчики отключают по одному, а не все сразу. Отключение всего кода подтверждает, что дело в нём, но не говорит, в каком именно файле, а по одному находит виновника за несколько минут.
Правка файлов ядра ради отладки не окупается никогда. Обновление вернёт файл к исходному виду, а сбой, который лечили этой правкой, вернётся вместе с ним и уже без всяких следов.
Кэш умеет прятать результат правок. Проверка на боевом сайте начинается со сброса кэша нужной страницы, иначе полчаса уходит на разбор того, чего в коде уже нет.
Типичные проблемы
Посетители видят пути к файлам и текст ошибки.
Показ ошибок включён для всех, а не в журнал. На боевом сайте подробности пишут в журнал, а не выводят на экран.
В журнале пусто, а сайт падает.
Смотрят не тот журнал: процессы PHP, платформа и веб-сервер пишут в разные файлы. Проверять нужно все три.
Ответ обмена или запроса сломался после включения отладки.
Отладочный вывод попадает в тело ответа. Для служебных адресов вывод отключают полностью.
Правка не влияет на поведение страницы.
Страница отдаётся из кэша. Проверку начинают со сброса кэша этой страницы.
После обновления сбой вернулся.
Он лечился правкой файла ядра. Обновление вернуло файл к исходному виду вместе с ошибкой.
Частые вопросы
Можно ли включить отладку только для себя?
Да, по признаку администратора или по адресу подключения. Посетители при этом видят обычную страницу.
Где искать ошибки своего кода?
В журнале платформы и в журнале процессов PHP. Свои сообщения удобно писать туда же, а не в вывод страницы.
Что делать с ошибкой, которая не повторяется?
Добавить запись в журнал в подозрительном месте и ждать повтора. Разовые сбои чаще всего связаны с нагрузкой или с внешним сервисом.
Нужен ли отладчик на боевом сервере?
Нет, пошаговая отладка на боевом сайте останавливает процессы. Её место на копии, а на боевом остаются журналы.
Смежное
-
Ошибки сервера и базы данных - оглавление подтемы
-
Белая страница вместо сайта: разбор причин - когда на экране вообще ничего нет
-
Ошибки 500 и 502: где искать причину и чем они отличаются - разбор конкретных кодов
-
MySQL Query Error: причины по убыванию частоты - ошибки на стороне базы
-
Журнал событий: чтение, очистка, свои записи - куда писать свои сообщения
-
Инфраструктура и хостинг - устройство площадки целиком
-
Меню окружения и службы: что где лежит и как перезапустить - где лежат журналы окружения
-
Свой журнал решения: файл, ротация, что писать - что завести до сбоя
-
Отладчик на стенде: подключение, точки останова, обмен и cron - то же самое там, где можно
-
Сбор ошибок сайта в одном месте: перехват, уведомление, секреты - когда ошибки надо ловить постоянно
-
Доступ запрещён и код 403: кто отдал отказ - разбор отказа по журналам сервера
-
Ошибка сайта изнутри: слои, коды, журналы - устройство слоёв за этим порядком действий