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| Parameter | Beschreibung |
|---|---|
$parser | Das 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()einXMLParser-Objekt statt einer Ressource zurück. Der Aufruf vonxml_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, nichtbook). Deaktivieren Sie dies mitxml_parser_set_option()und dem FlagXML_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.