问题
I've got a variable $dom
that contains an instance of PHP's DOMDocument. This variable is being set and unset within a loop.
unset($dom)
will not release memory, though: memory_get_usage(false)
reports that only 700B of about 10MB got released. memory_get_usage(true)
reports the exact same amount of memory usage before and after unset()
.
I tried the following:
I checked that the reference count of $dom is exactly one immediately before the call to
unset()
:xdebug_debug_zval('dom')
reports: dom: (refcount=1, is_ref=0)=class DOMDocument { }.I tried the solution proposed in DOMDocument PHP Memory Leak but this was to no avail.
I tried
gc_enable()
+gc_collect_cycles()
. But this did not help either.I tried calling
$dom->__destruct()
beforeunset()
but this will result in an error as DOMDocument apparently does not have a destructor.I recursively removed all nodes in the DOM before I unset the variable. It did not make the least difference.
I tried setting the variable to null before re-using it:
$dom = null
Now I'm out of ideas... Anybody got a suggestion what else I could try to debug or solve this problem?
Edit:
php -v reports 5.3.10-1ubuntu3.2 with Suhosin-Patch (cli)
The source code can be seen here: https://github.com/jerico-dev/ojs/blob/dev/plugins/generic/lucene/classes/SolrWebService.inc.php#L256
The output of the first few iterations is:
before object creation: 19292296 after object creation: 29849832 before unset: 30055232 after unset: 30054448 before object creation: 29849592 after object creation: 39858840 before unset: 40079920 after unset: 40079136 before object creation: 39858272 after object creation: 49923216 before unset: 50136448 after unset: 50135664
回答1:
This should release the memory store in $dom.
$dom = null;
来源:https://stackoverflow.com/questions/11703164/php-domdocument-unset-does-not-release-resources