Вызывает ли это утечку памяти PHP?

#php

#php

Вопрос:

Вызывает ли это утечку памяти PHP?

 function xml_parse($xmlString)
{
    return json_decode(json_encode(new SimpleXMLElement($xmlString)), true);
}
  

Или мне нужно сбросить SimpleXML obj таким образом?

 function xml_parse($xmlString)
{
    $sObj = new SimpleXMLElement($xmlString);
    $ret  = json_decode(json_encode($sObj), true);
    unset($sObj);
    return $ret;
}
  

Я запускаю это в большом foreach, поскольку скрипту необходимо проанализировать много файлов.

Комментарии:

1. Похоже bugs.php.net/bug.php?id=62468

Ответ №1:

Если вы действительно хотите знать, запустите его пару тысяч раз и выведите использование памяти. Обычно неиспользуемые объекты будут очищены сборщиком мусора, поэтому первый фрагмент не будет «пропускать» память. Однако в PHP <5.3 существует проблема с циклическими ссылками, которая может препятствовать сбору неиспользуемых объектов. Поэтому, если у вас возникнет проблема, обновление PHP может решить ее за вас.

Комментарии:

1. Я выполнил 2 тестовых запуска, и с помощью первого метода я получил около 400 МБ, а со вторым методом — около 270 МБ. На PHP5.3.6 (MAMP)

Ответ №2:

Я не гуру uber PHP, но я бы, вероятно, пошел со вторым примером, который у вас есть, просто на всякий случай.

Ответ №3:

Это не приведет к утечке памяти. Сборщик мусора PHP увидит, что на SimpleXMLElement не осталось ссылок, и при необходимости удалит его.