Сколько копий XML загружается в ОЗУ при DOMDocument->load()/domxml_open_file

alekciy

Новичок
Сколько копий XML загружается в ОЗУ при DOMDocument->load()/domxml_open_file

Предположим есть функция которая при свой работе создает DomDocument объект (хотя бы через тот же domxml_open_file) и работает с ним. Возращает она обычный одномерный ассоциативный массив. Если к данной функции обратиться несколько раз, сколько копий XML файла будет загружено в ОЗУ? Или после отработки функции DomDocument объект удаляется? А если функция будет возращаться DOMNode объект?
 

slach

Новичок
тут вопрос скорее не по XML
тут вопрос скорее по механизму работы с памятью и сборке мусора в PHP
к сожалению не могу дать исчерпывающий ответ и однозначный ответ, попробуйте спросить tony2001 в личку

-~{}~ 15.03.06 16:17:

только вопрос сформулируйте более точно
 

alekciy

Новичок
Хм... вроде вполне точно сформулировал, хотя конечно это мне так кажется. В чем неточность? Просто я знаю, что XML документ грузиться в ОЗУ полностью и по идее каждый раз при его парсинге получается, что загружается еще раз. Вроде все верно сформулированно.. *задумчиво*
 

tony2001

TeaM PHPClub
на самом деле, отношение к PHP очень косвенное.
при DomDocument::load() вызывается dom_document_parser() из libxml, а уж что она внутри делает - хз.
насколько я понимаю, эта функция как раз и создаёт новый "инстанс" парсера.
так что ответ - да, N вызовов -> N инстансов парсера (с кодом XML внутри).

>Или после отработки функции DomDocument объект удаляется?
объект удаляется когда объект удаляется.
не понял формулировки вопроса.

>А если функция будет возращаться DOMNode объект?
а тут вообще слова в предложение плохо складываются..
 

alekciy

Новичок
>так что ответ - да...
Вот это я и хотел уточнить.

>не понял формулировки вопроса.
Это в приниципе уже не принципиально, на главный вопрос мучавший меня я ответ уже получил. Но все же уточню. И так имеется функция, в ней содержатся переменные и некие действия над ними. Из основной программы происходит вызов функции, в ОЗУ происходит резервирование места под переменные этой функции, над ними выполняются некие действия. Функция отработала и вернула/не_вернула в основную программу некие результаты (переменные). Поскольку переменные внутри функции являются локальными, то я так понимаю, что происходит их очистка/удаление. Хотя конечно может они и не удаляются, но доступа к ним мы все равно не имеем. По крайней мере я так себе работу функций представляю, но конечно же могу и ошибаться, быть может тогда укажете на неточности?
Ну так вот, если происходит удаление переменных используемых в функции, то не следует ли отсюда, что и объект DomDocument (которые создан в результате работы функции) так же будет удален?

Собственно исходя из этих соображений и возник последний вопрос. Если в результаты работы функции будут возращены не строковые переменные, а объект класса DOMNode значит ли это, что весь XML останется загруженным в память или же произойдет копирование это объекта в переменную, возращаемую в основную программу, а все остальные объекты возникшие при парсировании документа будут удалены.

Надеюсь, что в такой формулировке моя мысль более понятна. Конечно я могу допустить какие терминологические неточности обусловленные неверным пониманием принципов работы языка. Слишком недолго я с этим все работаю. Извиняюсь тогда, но более внятнее видимо выразиться не могу (((

Большое спасибо за консультацию! ))
 

tony2001

TeaM PHPClub
>Ну так вот, если происходит удаление переменных используемых в функции, то не
> следует ли отсюда, что и объект DomDocument (которые создан в результате
> работы функции) так же будет удален?

конечно, следует.

>Если в результаты работы функции будут возращены не строковые переменные, а
> объект класса DOMNode значит ли это, что весь XML останется загруженным в
> память или же произойдет копирование это объекта в переменную, возращаемую в
> основную программу, а все остальные объекты возникшие при парсировании
> документа будут удалены.

ресурс будет держаться до тех пор, пока есть хотя бы одна ссылка на него.
собственно, так со всеми переменными происходит.
кол-во ссылок == 0 --> ресурс (т.е. внешние для PHP дескрипторы или что там еще..) разрушается соотв-щим деструктором.
 

alekciy

Новичок
Следует ли отсюда (хотя бы чисто умозрительно, теоретически), что если функция не возращает узлы XML файла в виде объектов в тело основной программы, то и память занятая XML файлом будет очишена? Т.е. если функция проведет, к примеру, поиск нужных данных в XML файле, а потом просто возвратит найденое число/строку (а не объект).
 
Сверху