xml_parser_free()
La fonction xml_parser_free() libère la mémoire utilisée par un parseur XML PHP. Découvrez sa syntaxe, son utilisation et un exemple complet.
La fonction xml_parser_free() est une fonction native PHP qui libère la mémoire associée à un parseur XML. Elle fait partie de l'extension XML (Expat / SAX) de PHP et est appelée pour libérer un parseur une fois la lecture d'un document terminée.
Un parseur SAX créé avec xml_parser_create() lit un document comme un flux d'événements — une balise ouvrante, des données textuelles, une balise fermante — et déclenche vos fonctions de rappel pour chacun d'eux. Comme le parseur conserve des tampons internes et des références à ces fonctions, appeler xml_parser_free() en fin d'analyse supprime ces références afin que la mémoire puisse être récupérée.
Cette page explique ce que fait la fonction, quand vous en avez réellement besoin, et montre un exemple d'analyse complet et exécutable.
Syntaxe
xml_parser_free(XMLParser $parser): bool| Paramètre | Description |
|---|---|
$parser | Le handle du parseur retourné par xml_parser_create() ou xml_parser_create_ns(). |
Valeur de retour — retourne true en cas de succès, ou false si $parser ne correspond pas à un parseur valide.
Note de version : Dans PHP 8.0 et versions ultérieures,
xml_parser_create()retourne un objetXMLParserplutôt qu'une ressource. Appelerxml_parser_free()n'est plus strictement obligatoire — le parseur est libéré automatiquement lorsque l'objet sort de la portée et est collecté par le ramasse-miettes. La fonction est conservée pour la compatibilité ascendante et reste une bonne pratique dans les scripts à longue durée d'exécution où vous souhaitez libérer la mémoire immédiatement.
Quand devez-vous l'appeler ?
- Processus à longue durée d'exécution (workers de file, démons, traitements par lots en CLI) qui créent de nombreux parseurs — libérer chacun d'eux maintient la mémoire stable plutôt que de la laisser croître jusqu'à la fin du script.
- Fichiers XML volumineux ou nombreux, où conserver les tampons du parseur plus longtemps que nécessaire gaspille de la RAM.
- Avant PHP 8.0, où le parseur était une ressource et n'était pas lié au nettoyage basé sur la portée, donc le libérer explicitement était le seul moyen fiable de récupérer la mémoire en cours d'exécution.
Pour un script court et ponctuel qui se termine immédiatement après l'analyse, la différence est négligeable — PHP libère tout lors de l'arrêt de toute façon.
Exemple complet
L'extrait ci-dessous crée un parseur, enregistre des fonctions de rappel, analyse une chaîne XML, puis libère le parseur. Les fonctions collectent chaque titre <book> dans un tableau.
<?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);Résultat :
Array
(
[0] => PHP Basics
[1] => Mastering XML
)Quelques remarques importantes :
- Les noms d'éléments arrivent en majuscules par défaut (
BOOK, et nonbook). Désactivez ce comportement avecxml_parser_set_option()et l'optionXML_OPTION_CASE_FOLDINGsi vous avez besoin de la casse d'origine. - Le cycle de vie est toujours le même : créer → définir les fonctions de rappel → analyser → libérer. Les fonctions
xml_set_*(élément et données textuelles) font le vrai travail ;xml_parser_free()ferme simplement le cycle. - Après avoir appelé
xml_parser_free(), le handle$parsern'est plus utilisable — créez-en un nouveau si vous avez besoin d'analyser un autre document.
Conclusion
xml_parser_free() libère la mémoire détenue par un parseur Expat/SAX créé avec xml_parser_create(). Associez-la à xml_parser_create(), vos fonctions xml_set_* et xml_parse() pour gérer la mémoire proprement. À partir de PHP 8.0, le parseur est libéré automatiquement lorsqu'il sort de la portée, mais appeler la fonction explicitement reste une bonne habitude dans les scripts à longue durée d'exécution.