При обновлении 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/
Важно
- Код предназначен для диагностики — после проверки сайта его рекомендуется удалить.
- На боевом сайте не стоит держать постоянное логирование
E_NOTICEиE_DEPRECATED. - Идеально использовать этот код при прогоне сайта роботом или после обновлений.
Такой подход позволяет быстро найти проблемные места в шаблонах и модулях без влияния на пользователей и SEO.