W3docs

xml_parser_free()

Die Funktion xml_parser_free() ist eine eingebaute PHP-Funktion, die den Speicher eines XML-Parsers freigibt. Beim Parsen von XML-Dateien mit der SimpleXML-Bibliothek oder

Die Funktion xml_parser_free() ist eine eingebaute PHP-Funktion, die den mit einem XML-Parser verbundenen Speicher freigibt. Sie gehört zur XML (Expat / SAX)-Erweiterung von PHP und wird aufgerufen, um einen Parser freizugeben, sobald das Lesen eines Dokuments abgeschlossen ist.

Ein SAX-Parser, der mit xml_parser_create() erstellt wurde, liest ein Dokument als Strom von Ereignissen — ein Start-Tag, Zeichendaten, ein End-Tag — und löst für jedes davon Ihre Callback-Handler aus. Da der Parser interne Puffer und Referenzen auf diese Handler hält, bricht der Aufruf von xml_parser_free() nach dem Parsen diese Referenzen auf, sodass der Speicher zurückgewonnen werden kann.

Diese Seite erklärt, was die Funktion bewirkt, wann Sie sie tatsächlich benötigen, und zeigt ein vollständiges, ausführbares Parsing-Beispiel.

Syntax

xml_parser_free(XMLParser $parser): bool
ParameterBeschreibung
$parserDas Parser-Handle, das von xml_parser_create() oder xml_parser_create_ns() zurückgegeben wird.

Rückgabewert — gibt true bei Erfolg zurück oder false, wenn $parser nicht auf einen gültigen Parser verweist.

Versionshinweis: In PHP 8.0 und höher gibt xml_parser_create() ein XMLParser-Objekt statt einer Ressource zurück. Der Aufruf von xml_parser_free() ist nicht mehr zwingend erforderlich — der Parser wird automatisch freigegeben, wenn das Objekt den Gültigkeitsbereich verlässt und durch den Garbage Collector verarbeitet wird. Die Funktion wird für die Abwärtskompatibilität beibehalten und ist in lang laufenden Skripten, in denen der Speicher sofort freigegeben werden soll, weiterhin empfehlenswert.

Wann sollte die Funktion aufgerufen werden?

  • Lang laufende Prozesse (Queue-Worker, Daemons, CLI-Batch-Jobs), die viele Parser erstellen — das Freigeben jedes einzelnen hält den Speicher konstant, anstatt ihn bis zum Ende des Skripts ansteigen zu lassen.
  • Große oder zahlreiche XML-Dateien, bei denen das längere Halten von Parser-Puffern RAM verschwendet.
  • Vor PHP 8.0, wo der Parser eine Ressource war und nicht an die bereichsbasierte Bereinigung gebunden war, sodass das explizite Freigeben die einzige zuverlässige Methode war, Speicher mitten im Skript zurückzugewinnen.

Bei einem kurzen, einmaligen Skript, das direkt nach dem Parsen beendet wird, ist der Unterschied vernachlässigbar — PHP gibt beim Herunterfahren ohnehin alles frei.

Vollständiges Beispiel

Das folgende Snippet erstellt einen Parser, registriert Handler, parst einen XML-String und gibt den Parser anschließend frei. Die Handler sammeln jeden <book>-Titel in einem Array.

<?php
$xml = <<<XML
<?xml version="1.0"?>
<library>
  <book>PHP Basics</book>
  <book>Mastering XML</book>
</library>
XML;

$titles  = [];
$current = false;

// Fired on every opening tag
function startTag($parser, $name, $attrs) {
    global $current;
    $current = ($name === "BOOK"); // tag names are upper-cased by default
}

// Fired on every closing tag
function endTag($parser, $name) {
    global $current;
    $current = false;
}

// Fired for the text between tags
function charData($parser, $data) {
    global $current, $titles;
    if ($current && trim($data) !== "") {
        $titles[] = trim($data);
    }
}

$parser = xml_parser_create();
xml_set_element_handler($parser, "startTag", "endTag");
xml_set_character_data_handler($parser, "charData");

// Parse the whole document in one call (final argument = true)
xml_parse($parser, $xml, true);

// Release the parser's memory now that we are done
xml_parser_free($parser);

print_r($titles);

Ausgabe:

Array
(
    [0] => PHP Basics
    [1] => Mastering XML
)

Ein paar Dinge, die zu beachten sind:

  • Elementnamen kommen standardmäßig großgeschrieben an (BOOK, nicht book). Deaktivieren Sie dies mit xml_parser_set_option() und dem Flag XML_OPTION_CASE_FOLDING, wenn Sie die ursprüngliche Schreibweise benötigen.
  • Der Lebenszyklus ist immer gleich: erstellen → Handler setzen → parsen → freigeben. Die xml_set_*-Handler (Element und Zeichendaten) erledigen die eigentliche Arbeit; xml_parser_free() schließt lediglich den Zyklus ab.
  • Nach dem Aufruf von xml_parser_free() ist das $parser-Handle nicht mehr verwendbar — erstellen Sie ein neues, wenn Sie ein weiteres Dokument parsen möchten.

Fazit

xml_parser_free() gibt den Speicher frei, der von einem Expat/SAX-Parser gehalten wird, der mit xml_parser_create() erstellt wurde. Verwenden Sie die Funktion zusammen mit xml_parser_create(), Ihren xml_set_*-Handlern und xml_parse(), um den Speicher sauber zu verwalten. Ab PHP 8.0 wird der Parser automatisch freigegeben, wenn er den Gültigkeitsbereich verlässt, aber die Funktion explizit aufzurufen bleibt eine sinnvolle Gewohnheit in lang laufenden Skripten.

Übungen

Übung
Welche Funktionalitäten bietet die Funktion xml_parse() in PHP?
Welche Funktionalitäten bietet die Funktion xml_parse() in PHP?
Was this page helpful?