Start · Sprachen · PHP · Referenz · libxml_use_internal_errors

libxml_use_internal_errors

Funktion

Deaktiviert die standardmäßige libxml-Fehlerausgabe und erlaubt das manuelle Abrufen der Fehlerinformationen über <code>libxml_get_errors()</code>.

seit PHP 5.1.0 Kategorie: xml

Signatur

libxml_use_internal_errors(?bool $use_errors = null): bool

Beschreibung

libxml_use_internal_errors() steuert, wie libxml-basierte PHP-Erweiterungen (z. B. DOMDocument, SimpleXML oder XMLReader) mit Parsing-Fehlern umgehen. Standardmäßig gibt libxml Fehler direkt aus oder wirft Warnungen. Wenn diese Funktion mit true aufgerufen wird, werden diese Fehler intern gepuffert und können später mit libxml_get_errors() ausgelesen werden.

Das ist besonders nützlich beim Parsen von HTML-Dokumenten aus externen Quellen (z. B. Web-Scraping oder E-Mail-Verarbeitung), die häufig nicht valides HTML enthalten. Ohne interne Fehlerbehandlung würde PHP für jede Abweichung vom Standard eine Warnung ausgeben, was in der Produktion problematisch ist.

Nach dem Verarbeiten der Fehler sollte der interne Fehlerpuffer mit libxml_clear_errors() geleert werden, um Speicher freizugeben und zu verhindern, dass Fehler aus früheren Operationen versehentlich mitgelesen werden.

Wird die Funktion ohne Argument oder mit null aufgerufen, gibt sie den aktuellen Status zurück, ohne ihn zu verändern.

Parameter

Name Typ Default Beschreibung
$use_errors bool|null null Wenn true, werden libxml-Fehler intern gepuffert statt ausgegeben. Wenn false, wird die Standard-Fehlerausgabe wiederhergestellt. Bei null (ab PHP 8.0) oder ohne Argument wird der aktuelle Status abgefragt, ohne ihn zu ändern.

Rückgabewert

Typ
bool
Beschreibung
Gibt den vorherigen Wert des internen Fehlerbehandlungsmodus zurück — true, wenn interne Fehlerbehandlung zuvor aktiv war, andernfalls false.

Beispiele

Fehlerbehandlung beim Parsen von fehlerhaftem HTML

<?php
// Interne Fehlerbehandlung aktivieren
libxml_use_internal_errors(true);

$dom = new DOMDocument();
$dom->loadHTML('<html><boedy>Ungültiges HTML</boedy></html>');

$errors = libxml_get_errors();
foreach ($errors as $error) {
    echo "Zeile {$error->line}: " . trim($error->message) . PHP_EOL;
}

// Fehlerpuffer leeren
libxml_clear_errors();

// Fehlerbehandlung wieder deaktivieren (optional)
libxml_use_internal_errors(false);
Zeile 1: Tag boedy invalid Zeile 1: Tag boedy invalid

Aktuellen Status abfragen ohne Änderung

<?php
// Zunächst aktivieren
libxml_use_internal_errors(true);

// Status abfragen (ab PHP 8.0: null übergeben, davor: kein Argument)
$currentStatus = libxml_use_internal_errors(null);
echo $currentStatus ? 'Intern aktiv' : 'Intern inaktiv';
// Achtung: In PHP < 8.0 ändert der Aufruf ohne Argument den Wert auf false!
// Dort den Rückgabewert nutzen und danach wieder aktivieren.
Intern aktiv

Valides Prüfen eines XML-Dokuments ohne Ausgabe

<?php
libxml_use_internal_errors(true);

$xml = simplexml_load_string('<root><item>Test</item><unclosed></root>');

if ($xml === false) {
    echo "XML enthält Fehler:" . PHP_EOL;
    foreach (libxml_get_errors() as $error) {
        echo '  [' . $error->level . '] ' . trim($error->message) . PHP_EOL;
    }
    libxml_clear_errors();
} else {
    echo "XML erfolgreich geladen." . PHP_EOL;
}
XML enthält Fehler: [2] Opening and ending tag mismatch: item line 1 and root [2] Opening and ending tag mismatch: root line 1 and unclosed [3] Extra content at the end of the document

// Wichtig · Fallstricke

Achtung bei PHP < 8.0: Ein Aufruf von libxml_use_internal_errors() ohne Argument setzt den Wert auf false zurück (da der Parameter standardmäßig false war). Wenn Sie den Status nur abfragen möchten, müssen Sie den Rückgabewert speichern und anschließend libxml_use_internal_errors(true) erneut aufrufen. Erst ab PHP 8.0 ist der Parameter nullable (?bool).

Fehlerpuffer leeren: Vergessen Sie nicht, libxml_clear_errors() nach der Fehlerverarbeitung aufzurufen. Andernfalls sammeln sich Fehler aus verschiedenen Operationen an und können zu unerwarteten Ergebnissen führen.

Geltungsbereich: Die Einstellung ist global für den gesamten PHP-Prozess. In lang laufenden Anwendungen (z. B. mit Symfony, Laravel) sollte der vorherige Zustand nach der Operation wiederhergestellt werden.