W3docs

xml_parser_free()

Функция xml_parser_free() освобождает память, занятую XML-парсером PHP. Узнайте, когда и как её использовать.

Функция xml_parser_free() — это встроенная функция PHP, которая освобождает память, связанную с XML-парсером. Она входит в состав расширения XML (Expat / SAX) PHP и вызывается для освобождения парсера после завершения чтения документа.

SAX-парсер, созданный с помощью xml_parser_create(), читает документ как поток событий — открывающий тег, символьные данные, закрывающий тег — и вызывает ваши обработчики обратного вызова для каждого из них. Поскольку парсер удерживает внутренние буферы и ссылки на эти обработчики, вызов xml_parser_free() по завершении разбора разрывает эти ссылки, позволяя освободить память.

На этой странице объясняется, что делает функция, когда она действительно нужна, и приводится полный рабочий пример разбора.

Синтаксис

xml_parser_free(XMLParser $parser): bool
ПараметрОписание
$parserДескриптор парсера, возвращённый функцией xml_parser_create() или xml_parser_create_ns().

Возвращаемое значение — возвращает true в случае успеха или false, если $parser не ссылается на допустимый парсер.

Примечание о версиях: В PHP 8.0 и выше функция xml_parser_create() возвращает объект XMLParser, а не ресурс. Вызов xml_parser_free() больше не является строго обязательным — парсер освобождается автоматически, когда объект выходит из области видимости и удаляется сборщиком мусора. Функция сохранена для обратной совместимости и по-прежнему является хорошей практикой в длительно работающих скриптах, где вы хотите немедленно освободить память.

Когда следует вызывать эту функцию?

  • Длительно работающие процессы (обработчики очередей, демоны, пакетные CLI-задачи), которые создают множество парсеров — освобождение каждого из них поддерживает потребление памяти стабильным, не давая ей расти до завершения скрипта.
  • Большие или многочисленные XML-файлы, где удержание буферов парсера дольше необходимого расходует оперативную память.
  • До PHP 8.0, когда парсер являлся ресурсом и не был привязан к очистке по области видимости, поэтому явное его освобождение было единственным надёжным способом вернуть память в середине скрипта.

Для короткого одноразового скрипта, который завершается сразу после разбора, разница незначительна — PHP в любом случае освобождает всё при завершении работы.

Полный пример

Фрагмент кода ниже создаёт парсер, регистрирует обработчики, разбирает XML-строку, а затем освобождает парсер. Обработчики собирают все заголовки <book> в массив.

<?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);

Вывод:

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

Несколько замечаний:

  • Имена элементов по умолчанию передаются в верхнем регистре (BOOK, а не book). Отключить это можно с помощью xml_parser_set_option() и флага XML_OPTION_CASE_FOLDING, если вам нужен исходный регистр.
  • Жизненный цикл всегда одинаков: создать → установить обработчики → разобрать → освободить. Обработчики xml_set_* (элементов и символьных данных) выполняют основную работу; xml_parser_free() просто завершает цикл.
  • После вызова xml_parser_free() дескриптор $parser больше не пригоден для использования — создайте новый, если нужно разобрать ещё один документ.

Заключение

xml_parser_free() освобождает память, удерживаемую парсером Expat/SAX, созданным с помощью xml_parser_create(). Используйте её совместно с xml_parser_create(), обработчиками xml_set_* и xml_parse() для чистого управления памятью. Начиная с PHP 8.0 парсер освобождается автоматически при выходе из области видимости, однако явный вызов функции остаётся разумной привычкой в длительно работающих скриптах.

Практика

Практика
Какие возможности предоставляет функция xml_parse() в PHP?
Какие возможности предоставляет функция xml_parse() в PHP?
Was this page helpful?