libxml_use_internal_errors()
Функция libxml_use_internal_errors() в PHP позволяет включить или отключить внутреннюю обработку ошибок libxml вместо вывода предупреждений.
Функция libxml_use_internal_errors() позволяет указать PHP-расширениям на основе libxml (DOM, SimpleXML, XMLReader, XMLWriter) прекратить выводить предупреждения на экран и вместо этого собирать их во внутренний буфер, который вы можете проверять из собственного кода.
На этой странице объясняется, что делает функция, её сигнатура и возвращаемое значение, а также как комбинировать её с остальным API ошибок libxml для корректной обработки некорректного XML.
Зачем использовать внутреннюю обработку ошибок?
По умолчанию, когда libxml встречает некорректный XML, он генерирует PHP предупреждения. В веб-приложении эти предупреждения либо засоряют вывод, либо молча подавляются в зависимости от настроек display_errors/error_reporting — и у вас нет структурированного способа на них реагировать.
Вызов libxml_use_internal_errors(true) меняет это поведение:
- Разбор больше не генерирует PHP предупреждения. Скрипт продолжает выполняться.
- Каждая проблема помещается во внутренний буфер в виде объекта
LibXMLError. - Вы сами решаете, что делать — записать в лог, показать понятное сообщение, прервать выполнение или проигнорировать некритические проблемы.
Это стандартный паттерн для разбора XML, который вы не контролируете (загрузки пользователей, сторонние фиды, скрапинг HTML).
Синтаксис
libxml_use_internal_errors(?bool $use_errors = null): bool$use_errors— передайтеtrue, чтобы включить внутреннюю обработку ошибок,false— чтобы отключить. Передайтеnull(или опустите аргумент), чтобы запросить текущее состояние без изменения.- Возвращаемое значение — функция возвращает предыдущее значение настройки (
bool). Это позволяет восстановить прежнее состояние по завершении работы, не затрагивая несвязанный код.
Как использовать libxml_use_internal_errors()
Включите внутренние ошибки, разберите документ, затем прочитайте буфер с помощью libxml_get_errors() и очистите его с помощью libxml_clear_errors().
Пример ниже разбирает некорректный XML непосредственно в коде (внешний файл не нужен, поэтому вы можете запустить его как есть):
<?php
// 1. Route libxml warnings into the internal buffer.
libxml_use_internal_errors(true);
// 2. Deliberately broken XML: <from> is never closed.
$xml = <<<XML
<?xml version="1.0"?>
<note>
<to>Tove</to>
<from>Jani
</note>
XML;
$doc = new DOMDocument();
$doc->loadXML($xml);
// 3. Inspect what went wrong.
foreach (libxml_get_errors() as $error) {
echo trim($error->message) . " (line {$error->line})\n";
}
// 4. Empty the buffer so later parses start clean.
libxml_clear_errors();
?>Вывод:
Opening and ending tag mismatch: from line 4 and note (line 5)
Premature end of data in tag note line 2 (line 5)Обратите внимание, что PHP предупреждение не было выведено — некорректный документ породил два структурированных объекта ошибки.
Чтение объекта LibXMLError
Каждый элемент, возвращаемый libxml_get_errors() (или libxml_get_last_error()), является объектом LibXMLError с полезными полями:
| Свойство | Значение |
|---|---|
level | Серьёзность: LIBXML_ERR_WARNING, LIBXML_ERR_ERROR, LIBXML_ERR_FATAL |
code | Числовой код ошибки libxml |
message | Описание в удобочитаемом виде (часто с завершающим переносом строки) |
line | Номер строки в источнике |
column | Номер столбца |
file | Имя файла или пустая строка при разборе строки |
Вы можете использовать level, чтобы игнорировать безвредные предупреждения и при этом завершать работу при фатальных ошибках:
<?php
libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->loadXML('<a><b></a>'); // mismatched tags → fatal
$error = libxml_get_last_error();
if ($error && $error->level === LIBXML_ERR_FATAL) {
echo "Fatal parse error (code {$error->code})\n";
}
?>Вывод:
Fatal parse error (code 77)Восстановление предыдущего состояния
Поскольку функция возвращает предыдущее значение настройки, библиотека, которая включает внутренние ошибки, должна восстановить их после окончания работы, чтобы не изменять поведение для остального приложения:
<?php
$previous = libxml_use_internal_errors(true);
// ... parse XML and handle libxml_get_errors() ...
libxml_clear_errors();
libxml_use_internal_errors($previous); // restore whatever the caller had
?>Распространённые ошибки
- Буфер глобальный и постоянный. Ошибки накапливаются до вызова
libxml_clear_errors()(или окончания запроса). Всегда очищайте его между разборами, иначе будете повторно читать устаревшие ошибки. - Это также влияет на загрузку HTML.
DOMDocument::loadHTML()сообщает о некорректной разметке через тот же механизм — удобно для скрапинга несовершенного HTML без предупреждений. - Отключение возобновляет PHP предупреждения. Вызов
libxml_use_internal_errors(false)возвращает libxml к поведению по умолчанию — генерации предупреждений и уведомлений.
Заключение
libxml_use_internal_errors() — это шлюз к надёжной обработке XML в PHP: включите её, чтобы подавить стандартные предупреждения libxml, затем используйте libxml_get_errors(), libxml_get_last_error() и libxml_clear_errors() для самостоятельной проверки и управления проблемами. Не забывайте про возвращаемое значение, чтобы восстановить предыдущее состояние, и всегда очищайте буфер между разборами.