Исправление проблем PHP на портале Битрикс

Раздел: Ошибки PHP -> Ошибки CMS

Типичные ошибки PHP в Битрикс и способы их исправления

При работе с CMS Битрикс разработчики и администраторы часто сталкиваются с различными ошибками PHP. Ниже рассмотрены основные варианты их диагностики и устранения с примерами кода.

Как включить отображение всех ошибок PHP в Битрикс для диагностики?

Добавление следующих строк в файл bitrix/php_interface/init.php позволяет увидеть ошибки на экране:

<?
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Bitrix error php (ошибка php в битрикс)

После этого все ошибки, предупреждения и уведомления будут выводиться при обращении к страницам сайта. Альтернативный способ - задать параметры через файл .htaccess в корне сайта:

php_flag display_errors on
php_value error_reporting -1

Возникающие проблемы и типичные ошибки:

  • На боевом сайте не рекомендуется включать отображение ошибок всем посетителям. Решение - проверять IP администратора или использовать условное включение:
if (in_array($_SERVER['REMOTE_ADDR'], ['127.0.0.1', 'xxx.xxx.xxx.xxx'])) {
    ini_set('display_errors', 1);
    error_reporting(E_ALL);
}

Другая проблема: после включения отображения могут появляться Warning и Notice от сторонних модулей. Их можно отключить, изменив уровень отчёта, например: error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);

Как исправить ошибку «Allowed memory size exhausted»?

Фатальная ошибка из-за нехватки памяти возникает при обработке больших объёмов данных (выгрузка каталога, запуск агентов, массовая обработка заказов).

Решение: увеличить лимит памяти через init.php:

ini_set('memory_limit', '256M');

или через .htaccess:

php_value memory_limit 256M

Если хостер ограничивает возможности, необходимо обратиться к нему или изменить php.ini.

Возможные проблемы:

Некоторые хостинги не позволяют менять настройки через .htaccess. В таком случае можно попытаться указать значение в bitrix/.settings_extra.php.

Как найти синтаксическую ошибку в PHP-файле, не запуская сайт?

После редактирования файла часто возникает Parse error. Быстрая проверка - консольная команда php -l:

php -l /home/bitrix/www/bitrix/modules/main/classes/general/version.php

Вывод:

No syntax errors detected in /home/bitrix/www/bitrix/modules/main/classes/general/version.php

Если есть ошибка, команда укажет строку и причину.

Типичные ошибки:

Отсутствие доступа к консоли. В таком случае нужно включить отображение ошибок (как в rbase) и открыть страницу, где используется файл.

Где искать записи об ошибках PHP в Битрикс?

Ошибки можно записывать в отдельный файл, не выводя на экран. Для этого в init.php добавляется:

ini_set('log_errors', 1);
ini_set('error_log', $_SERVER['DOCUMENT_ROOT'].'/bitrix/php_errors.log');

После этого все ошибки будут сохраняться в файл /bitrix/php_errors.log. Также можно смотреть логи сервера (обычно /var/log/php-fpm/ или error.log в панели хостинга).

Возможные проблемы:

Файл лога может разрастаться. Рекомендуется настроить ротацию (например, через cron).

Расширенные примеры обработки ошибок PHP в Битрикс

Следующие примеры помогут глубже разобраться с диагностикой и управлением ошибками.

Перехват фатальных ошибок с помощью register_shutdown_function

Фатальные ошибки (например, превышение времени выполнения) не обрабатываются стандартным try-catch. Следующий код в init.php записывает такую ошибку в лог с дополнительной информацией:

Пример
register_shutdown_function(function() {
    $error = error_get_last();
    if ($error !== null && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
        $log = date('Y-m-d H:i:s') . ' ' . $error['message'] . ' в файле ' . $error['file'] . ' на строке ' . $error['line'] . PHP_EOL;
        file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/bitrix/fatal_errors.log', $log, FILE_APPEND);
    }
});

Результат (содержимое файла fatal_errors.log):

2025-04-10 12:34:56 Maximum execution time of 30 seconds exceeded в файле /home/bitrix/www/bitrix/modules/main/classes/general/cache.php на строке 128

Обработка исключений при работе с ORM Битрикс

При запросах к базе данных через ядро Битрикс рекомендуется оборачивать вызовы в try-catch:

Пример
use Bitrix\Main\Loader;
use Bitrix\Main\Entity\Query;

try {
    $query = new Query(\Bitrix\Iblock\ElementTable::getEntity());
    $result = $query->setSelect(['ID', 'NAME'])->exec();
} catch (\Bitrix\Main\DB\SqlQueryException $e) {
    $message = 'Ошибка SQL: ' . $e->getMessage();
    \CEventLog::Add(['SEVERITY' => 'ERROR', 'AUDIT_TYPE_ID' => 'SQL_ERROR', 'MODULE_ID' => 'main', 'DESCRIPTION' => $message]);
}

Результат: в административном разделе в журнале событий появится запись об ошибке SQL.

Фильтрация отображаемых ошибок по типу

Иногда нужно видеть только фатальные ошибки, игнорируя предупреждения. Настройка в init.php:

Пример
error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);

Теперь будут выводиться только ошибки уровня E_ERROR, E_PARSE и подобные.

Использование Xdebug для пошаговой отладки

Xdebug позволяет отслеживать выполнение скриптов. Установка и настройка (пример для php.ini):

Пример
zend_extension = xdebug.so
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.client_host = 127.0.0.1
xdebug.client_port = 9003

После перезапуска PHP можно подключаться из IDE (например, PhpStorm) и ставить точки останова непосредственно в коде Битрикс.

Отключение отображения ошибок для всех, кроме администратора (через .htaccess)

Если нет доступа к init.php, можно использовать .htaccess с проверкой по IP:

Пример
SetEnvIf REMOTE_ADDR ^127\.0\.0\.1$ admin_ip=1
SetEnvIf REMOTE_ADDR ^xxx\.xxx\.xxx\.xxx$ admin_ip=1
php_value display_errors 0
php_value error_reporting 0
SetEnvIf admin_ip 1 php_value display_errors 1
SetEnvIf admin_ip 1 php_value error_reporting -1

Данная конфигурация включает отображение ошибок только для указанных IP.

Ошибка PHP в Битрикс - comments

En
Bitrix error php (php)