Исправление проблем PHP на портале Битрикс
Типичные ошибки 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.