08.01.2026 Уже прочитали 501 раз

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

При обновлении PHP, модулей или шаблонов (например, АСПРО) на сайте могут появляться ошибки, которые не видны пользователям, но приводят к падениям страниц или некорректной работе. Чтобы быстро выявлять такие проблемы, удобно включить логирование PHP-ошибок с указанием конкретной страницы, где они возникают.

Зачем это нужно

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

Решение: логирование PHP-ошибок в header.php

Ниже приведён минимальный и безопасный код, который нужно вставить в самое начало файла header.php, до любого вывода и до подключения /bitrix/header.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));
        }
    });
}

Что будет в логе

Все ошибки будут записываться в файл: /bitrix/php_interface/php_errors_site.log

Пример записи:

[2026-01-08 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/

Важно

  1. Код предназначен для диагностики — после проверки сайта его рекомендуется удалить.
  2. На боевом сайте не стоит держать постоянное логирование E_NOTICE и E_DEPRECATED.
  3. Идеально использовать этот код при прогоне сайта роботом или после обновлений.

Такой подход позволяет быстро найти проблемные места в шаблонах и модулях без влияния на пользователей и SEO.

Обратная связь

Материал был полезен?

Оценка помогает понимать, какие материалы стоит развивать и дополнять.

Обсудить задачу

Обратиться за помощью

Опишите задачу и оставьте контакты. Я посмотрю вводные и свяжусь с вами удобным способом.

Направление *