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 парсер освобождается автоматически при выходе из области видимости, однако явный вызов функции остаётся разумной привычкой в длительно работающих скриптах.