W3docs

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ámetroDescripción
$parserEl 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 objeto XMLParser en lugar de un recurso. Llamar a xml_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, no book). Desactiva esto con xml_parser_set_option() y el indicador XML_OPTION_CASE_FOLDING si 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 $parser ya 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.

Práctica

Práctica
¿Cuáles son las funcionalidades que proporciona la función xml_parse() en PHP?
¿Cuáles son las funcionalidades que proporciona la función xml_parse() en PHP?
Was this page helpful?