Обработка ошибок в Битрикс
При разработке под Битрикс можно пользоваться не только логами, установленными в конфигурации сервера, но и своими. Для этого нужно настроить обработчик ошибок в секции exception_handling в файле /bitrix/.settings.php.
'exception_handling' =>
array (
'value' =>
array (
'handled_errors_types' => E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE & ~E_DEPRECATED,
'exception_errors_types' => E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_USER_WARNING & ~E_USER_NOTICE & ~E_COMPILE_WARNING,
'ignore_silence' => true,
'assertion_throws_exception' => false,
'assertion_error_type' => 256,
'debug' => true,
'log' => array (
'settings' => array (
'file' => 'bitrix/modules/error.log',
'log_size' => 1000000,
),
),
),
),
-
handled_errors_types — типы обрабатываемых ошибок
-
exception_errors_types — типы ошибок, в случае которых системой выбрасывается исключение, и работа скрипта останавливается
-
ignore_silence — отменить действие оператора подавления ошибок (значок @ перед функцией, например @file(), документация).
-
assertion_throws_exception — выбрасывают ли утверждения (assert()) исключения.
-
assertion_error_type — тип ошибки для неверного утверждения (по умолчанию — 256 E_USER_ERROR)
-
debug — если выставить debug = true, информация об ошибке будет выведена пользователю в браузер. Если debug = false, при возникновении ошибки будет выведено стандартное сообщение от Битрикс, кроме ошибок E_ERROR | E_PARSE
if ($this->debug)
{
error_reporting($this->handledErrorsTypes);
@ini_set('display_errors', 'On');
@ini_set('display_startup_errors', 'On');
@ini_set('report_memleaks', 'On');
}
else
{
error_reporting(E_ERROR | E_PARSE);
}
При отключении режима отладки, также сбрасываются настройки для assert()
if ($this->debug)
{
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_BAIL, 0);
assert_options(ASSERT_QUIET_EVAL, 0);
assert_options(ASSERT_CALLBACK, array($this, "handleAssertion"));
}
else
{
assert_options(ASSERT_ACTIVE, 0);
}
- log — секция с указанием логгера. Если пусто, то запись ошибок происходить не будет. В данном случае по умолчанию всю работу на себя возьмет объект класса BitrixMainDiagFileExceptionHandlerLog.
- settings — секция с настройками обработчика ошибок. Можно задавать произвольные параметры. Они все передадутся массивом в метод initialize() обработчика.
- file — относительный путь к файлу логов от корневой директории сайта (BitrixMainApplication::getDocumentRoot().’/’.$file).
- log_size — максимальный размер файла логов в байтах.
Можно использовать собственный обработчик ошибок для записи логов. Для этого в секции log нужно указать:
'class_name' => 'MyLog',
'extension' => 'MyLogExt',
'required_file' => 'modules/mylog.module/mylog.php'
- class_name — имя класса-обработчика. Класс должен наследоваться от BitrixMainDiagExceptionHandlerLog. Метод write в 16 версии отличается от реализации в 15 версии, эта несовместимость может сломать сайт, будьте внимательны.
- extension — подключаемое расширение, содержащее класс-обработчик
- required_file — файл, содержащий нужный класс.
Модули АХТУНГ 500 И АХТУНГ 500 ПРО
Модули Ахтунг 500 и Ахтунг 500 ПРО предназачены для мгновенного оповещения об ошибках по e-mail и через браузер, когда администратор находится на сайте.
Мониторинг ошибок происходит не только через обработчик ошибок Битрикса, но и через чтение файлов логов сервера, есть поиск.
Перейти к подробному описанию Ахтунг 500 ПРО
На сайте происходит экспорт товаров на сторонний ресурс через API.
Создан отдельный класс для работы с API который вызывается по событию «OnAfterIBlockElementAdd», все работает корректно, Но существуют события когда по какой то причине API отдает ошибку (невалидные данные, лимит аутентификации…). Эти ошибки пишутся в файл логов. (КМ забывает его проверять, от этого и проблема). Стоит задача сообщать КМ об ошибке «алертом на экран». Как это сделать?
public function setItemToOnliner($trueID, $data, $jwtToken)
{
if (!empty($error)) {
AddMessage2Log(print_r('error ONLINER '.$trueID), true));
$this->exportError();
}
}
static function exportError()
{
AddMessage2Log(print_r('error', true));
echo '<script type="text/javascript">alert("error")</script>';
}
Функция exportError() не выводит alert. Подскажите может кто знает как решить…
<?
/*=======================*/
//init.php
/*=======================*/
AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("ExportToPortal", "onlinerExport"));
CModule::AddAutoloadClasses(
'', //не указываем имя модуля, так как автозагрузка устанавливается глобально
array(
'ExportPortal' => '/local/classes/exportportal.php',
)
);
class ExportAll
{
function onlinerExport(&$arFields) {
if ($arFields["IBLOCK_ID"] == 2) {
$Onliner = new ExportPortal;
$Onliner->setOnliner(['ID'=>$arFields['ID'], 'SOLD'=>(!empty($arFields['PROPERTY_VALUES']['338'])) ? 'Y' : 'N' ], $arFields["IBLOCK_SECTION"][0]);
}
}
}
/*=======================*/
//exportportal.php
/*=======================*/
class ExportPortal extends CModule {
public function setOnliner($data, $section)
{
$access = $this->getAccessOnliner();
if (!empty($access['access_token'])) {
$arrOnliner = $this->setItemOnliner($data['ID'], $section);
if (!empty($arrOnliner['ITEM'])) {
if ($data['SOLD']=='Y') {
$this->removeItemOnliner($arrOnliner['ONLINER_ID'], $access['access_token']);
} else {
$this->setItemToOnliner($data['ID'], $arrOnliner, $access['access_token']);
}
}
}
}
public function setItemToOnliner($trueID, $data, $jwtToken)
{
/*.........*/
if (!empty($error)) {
AddMessage2Log(print_r('error ONLINER '.$trueID), true));
$this->exportError();
}
/*.........*/
}
static function exportError()
{
CAdminMessage::ShowMessage('ERROR');
}
}
Битрикс 17.0.9
На чтение 4 мин. Просмотров 1.2k. Опубликовано 15.12.2019
Уведомление об ошибке в админке битрикс, или непосредственно в визуальной его части. При выполнении скрипта возникла ошибка.
Это уведомление, я назову это именно так — уведомление, т.к. мы еще не знаем в чем же дело, битрикс нас просто информирует о том, что при выполнении скрипта возникла ошибка, не более того.
Итак рассмотрим по порядку:
Содержание
- Почему может появиться это уведомление?
- Что делать, если появляется сообщение «при выполнении скрипта возникла ошибка»?
- Как в битрикс включить вывод ошибок?
- Методы выявление ошибки
- Основные причины появления белого экрана
Почему может появиться это уведомление?
- Если уведомление появляется при разработке в публичной части сайта, то это однозначно ошибка в скрипте, вызвана, к примеру, ошибкой в синтаксисе в файле шаблона или в init.php, использованием функции, которая отсутствует и т.п.
- Если уведомление появляется в админке сайта, то это может быть вызвано ошибками, к примеру, в init.php или ошибками в ядре битрикса, которые обусловлены не той версией php. Это могло произойти, если битрикс у вас давно не обновлялся и при этом вы изменили версию php на, к примеру, php 7.1.
Теперь рассмотрим пути решения этой проблемы.
Что делать, если появляется сообщение «при выполнении скрипта возникла ошибка»?
Прежде всего необходимо включить вывод ошибок и предупреждений и посмотреть где у нас проблема.
Как в битрикс включить вывод ошибок?
Для старого ядра включить вывод ошибок можно в файле dbconn.php:
Чтобы в битрикс включить вывод ошибок для нового ядра D7 необходимо в файле .settings.php поставить значение debug => true:
Сейчас, наверное, уже сложно встретить сайты только на старом ядре, поэтому включать вывод ошибок в битрикс можно только в файле .settings.php
После устранения всех ошибок не забываем отключать вывод ошибок, пользователю не нужно их видеть, если вдруг что-нибудь еще всплывет. Всем удачи и успехов в работе!
Порой на сайте разработанном на 1с Битрикс вместо контента появляется белый экран. Были случаи появления чистого экрана после авторизации в админке.
Методы выявление ошибки
1. В файле .htaccess включаем вывод ошибок:
2. В файле /bitrix/php_interface/dbconn.php :
3. Смотреть лог ошибок (error log) веб-сервера (апач, файл error_log ).
4. В файле /bitrix/.settings.php установить
5. Проверить содержимое переменной $_SERVER[«DOCUMENT_ROOT»] . Там должен быть установлен корректный путь, иначе не подключаются файлы системы.
6. Запустить скрипт проверки системы на соответствия требованиям для стабильной работы 1с Битрикс bitrix_server_test.php
Основные причины появления белого экрана
- Кривое редактирование /bitrix/php_interface/init.php : ошибки, лишний пробел после ?>
- Такая же проблема с белым экраном возникла после переноса на другой сервер.
- Проверить настройку PHP — short_open_tag , которая должна быть в On.
- Не хватает оперативной памяти( memory_limit по умолчанию 128). Проблема решается следующим образом. Заходим в /bitrix/php_interface/dbconn.php . Редактируем ini_set(«memory_limit», «512M»);
Если вы сталкивались с этой проблемой пишите в комментариях, как её решили.
Если у вас на сайте произошла ошибка, но она не отображается и выводиться надпись о том, что ошибки нужно включить в файле .settings.php, то значит они у вас отключены в этом файле.
Включить их просто, для этого надо собственно открыть этот файл по FTP или через функционал Битрикс по следующему пути в админке битрикс
Рабочий стол->Контент->Структура сайта->Файлы и папки->bitrix
Здесь представлен многомерный массив данных, ключ-значение. Это основные настройки вашего сайта на битриксе.
Что бы включить отображение ошибок находим строку ‘debug’ которая находится внутри ‘exception_handling’->’value’ и ставим ей значение true вместо false.
Что бы настроить какие именно ошибки мы хотим отображать в ключе ‘exception_errors_types’ указываем код ошибок, например 29687, но он мало понятен, поэтому лучше использовать в значение данного ключа константы через пробел:
E_DEPRECATED,
Здесь мы перечислили все ошибки, предупредения и тд. Если нужно вывести только ошибки, то остальные константы можно просто убрать, поскольку уведомление