xml_parser_free()
La función xml_parser_free() libera la memoria utilizada por un analizador XML en PHP. Aprende cuándo y cómo usarla correctamente.
La función xml_parser_free() es una función integrada de PHP que libera la memoria asociada con un analizador XML. Pertenece a la extensión XML (Expat / SAX) de PHP y se llama para liberar un analizador una vez que has terminado de leer un documento.
Un analizador SAX creado con xml_parser_create() lee un documento como un flujo de eventos — una etiqueta de apertura, datos de caracteres, una etiqueta de cierre — y activa tus manejadores de devolución de llamada para cada uno. Dado que el analizador mantiene buffers internos y referencias a esos manejadores, llamar a xml_parser_free() cuando se completa el análisis rompe esas referencias para que la memoria pueda recuperarse.
Esta página explica qué hace la función, cuándo la necesitas realmente, y muestra un ejemplo de análisis completo y ejecutable.
Sintaxis
xml_parser_free(XMLParser $parser): bool| Parámetro | Descripción |
|---|---|
$parser | El identificador del analizador devuelto por xml_parser_create() o xml_parser_create_ns(). |
Valor de retorno — devuelve true en caso de éxito, o false si $parser no hace referencia a un analizador válido.
Nota de versión: En PHP 8.0 y versiones posteriores,
xml_parser_create()devuelve un objetoXMLParseren lugar de un recurso. Llamar axml_parser_free()ya no es estrictamente necesario — el analizador se libera automáticamente cuando el objeto sale del ámbito y es recolectado por el recolector de basura. La función se mantiene por compatibilidad con versiones anteriores y sigue siendo una buena práctica en scripts de larga duración donde deseas que la memoria se libere de inmediato.
¿Cuándo deberías llamarla?
- Procesos de larga duración (trabajadores de colas, daemons, trabajos por lotes CLI) que crean muchos analizadores — liberar cada uno mantiene la memoria estable en lugar de dejar que aumente hasta que el script termine.
- Archivos XML grandes o numerosos, donde mantener los buffers del analizador más tiempo del necesario desperdicia RAM.
- Antes de PHP 8.0, donde el analizador era un recurso y no estaba vinculado a la limpieza basada en el ámbito, por lo que liberarlo explícitamente era la única manera confiable de recuperar memoria a mitad del script.
Para un script corto y único que termina inmediatamente después del análisis, la diferencia es insignificante — PHP libera todo al apagarse de todas formas.
Ejemplo completo
El fragmento siguiente crea un analizador, registra manejadores, analiza una cadena XML y luego libera el analizador. Los manejadores recopilan cada título de <book> en un 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);Salida:
Array
(
[0] => PHP Basics
[1] => Mastering XML
)Algunas cosas que vale la pena destacar:
- Los nombres de elementos llegan en mayúsculas por defecto (
BOOK, nobook). Desactiva esto conxml_parser_set_option()y el indicadorXML_OPTION_CASE_FOLDINGsi necesitas el uso de mayúsculas original. - El ciclo de vida siempre es el mismo: crear → establecer manejadores → analizar → liberar. Los manejadores
xml_set_*(elemento y datos de caracteres) realizan el trabajo real;xml_parser_free()simplemente cierra el ciclo. - Después de llamar a
xml_parser_free(), el identificador$parserya no es utilizable — crea uno nuevo si necesitas analizar otro documento.
Conclusión
xml_parser_free() libera la memoria retenida por un analizador Expat/SAX creado con xml_parser_create(). Combínala con xml_parser_create(), tus manejadores xml_set_* y xml_parse() para gestionar la memoria de forma limpia. A partir de PHP 8.0, el analizador se libera automáticamente cuando sale del ámbito, pero llamar a la función explícitamente sigue siendo un hábito sensato en scripts de larga duración.