1С-Битрикс

Логирование PHP-ошибок после обновления Битрикс и перехода на PHP 8

Как настроить логирование PHP-ошибок в Bitrix после обновления ядра или перехода на PHP 8. Подробное руководство по диагностике скрытых ошибок без влияния на пользователей

sqlka.ruОпубликовано: Чтение: 3 мин.
Логирование PHP-ошибок после обновления Битрикс и перехода на PHP 8

После обновления ядра 1С-Битрикс, модулей, шаблонов (например, Аспро) или перехода на PHP 8 на сайте могут возникать скрытые ошибки. Они не отображаются пользователям, но приводят к падению страниц или некорректной работе функционала. Для оперативной диагностики необходимо настроить логирование PHP-ошибок с привязкой к конкретным URL-адресам.

Зачем нужно логирование ошибок?

  • Обнаружение падающих страниц, которые не видны обычным пользователям, но могут влиять на индексацию поисковыми роботами.
  • Отслеживание ошибок PHP 8+ (TypeError, Fatal error, Deprecated), которые часто появляются после обновления версии PHP.
  • Точная локализация проблем — определение конкретного файла, строки кода и URL, где происходит сбой.
  • Безопасная диагностика без вывода ошибок на экран, что важно для работающего сайта.

Решение: добавляем код логирования в header.php

Для включения логирования необходимо добавить следующий код в самый начало файла header.php вашего шаблона, до любого вывода и до подключения /bitrix/header.php.

<?php
$__phpErrorLogFile = $_SERVER['DOCUMENT_ROOT'] . '/bitrix/php_interface/php_errors_site.log';

if (!defined('LOG_PHP_ERRORS_ONCE')) {
    define('LOG_PHP_ERRORS_ONCE', true);

    // Отключаем вывод ошибок на экран
    @ini_set('display_errors', '0');
    @ini_set('display_startup_errors', '0');
    @ini_set('log_errors', '0');
    @error_reporting(E_ALL);

    // Функция записи в лог
    $__w = function ($lvl, $msg, $file = '', $line = 0) use ($__phpErrorLogFile) {
        $scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
        $url = ($scheme . '://' . ($_SERVER['HTTP_HOST'] ?? 'CLI') . ($_SERVER['REQUEST_URI'] ?? ''));
        $dt = date('Y-m-d H:i:s');
        $msg = str_replace(["\r", "\n"], [' ', ' '], (string)$msg);
        @file_put_contents($__phpErrorLogFile, "[$dt] [$lvl] $msg | $file:$line | $url\n", FILE_APPEND | LOCK_EX);
    };

    // Обработчик обычных ошибок
    set_error_handler(function ($errno, $errstr, $errfile, $errline) use ($__w) {
        if (!(error_reporting() & $errno)) return false;
        $__w('PHP', $errstr, $errfile, $errline);
        return false;
    });

    // Обработчик исключений
    set_exception_handler(function ($e) use ($__w) {
        $__w('EXCEPTION', get_class($e) . ': ' . $e->getMessage(), $e->getFile(), $e->getLine());
    });

    // Обработчик фатальных ошибок
    register_shutdown_function(function () use ($__w) {
        $e = error_get_last();
        if ($e && in_array((int)$e['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR], true)) {
            $__w('FATAL', $e['message'] ?? '', $e['file'] ?? '', (int)($e['line'] ?? 0));
        }
    });
}
?>

Как это работает?

  1. Код создает лог-файл /bitrix/php_interface/php_errors_site.log.
  2. Перехватывает все типы ошибок PHP (включая фатальные и исключения).
  3. Записывает каждую ошибку в лог с указанием:
    • Даты и времени
    • Типа ошибки (PHP, EXCEPTION, FATAL)
    • Сообщения об ошибке
    • Файла и строки кода
    • Полного URL, где произошла ошибка
  4. При этом ошибки не отображаются пользователям на экране.

Пример записи в логе

[2025-03-15 14:32:11] [FATAL] Cannot access offset of type string on string | /bitrix/modules/aspro.max/classes/general/CMax.php:1467 | https://site.ru/contacts/

Важные рекомендации

  • Используйте код для диагностики — после устранения ошибок рекомендуется удалить его из шаблона.
  • На работающем сайте не стоит постоянно логировать E_NOTICE и E_DEPRECATED, чтобы не создавать излишнюю нагрузку на диск.
  • Идеальный сценарий использования:
    1. Установить код после обновлений (ядро, модули, PHP).
    2. Провести обход сайта с помощью робота или вручную.
    3. Проанализировать лог-файл и исправить найденные ошибки.
    4. Удалить код из шаблона.
  • Перед внесением изменений создайте резервную копию файла header.php.

Заключение

Представленное решение позволяет безопасно и эффективно диагностировать скрытые ошибки PHP после любых обновлений на сайте под управлением 1С-Битрикс. Логирование с привязкой к URL дает максимально полную информацию для быстрого устранения проблем, что особенно важно при работе с PHP 8 и новыми версиями ядра.

Хотите освоить SQL для работы с данными?

В SQLka можно изучать SQL последовательно или готовиться к собеседованиям. Запросы выполняются прямо в браузере — устанавливать базу данных не нужно.

sqlka.ru

support@sqlka.ru

Дальше по теме

1С-Битрикс

Логирование в 1С-Битрикс: полное руководство для разработчика

Полное руководство по логированию в 1С-Битрикс: какие логгеры есть, как их настроить, форматировать сообщения и подключать к своим классам. Примеры кода и советы по использованию PSR-3

sqlka.ruЧтение: 4 мин.
← Все статьи