【发布时间】:2012-07-27 00:55:44
【问题描述】:
我有一个变量$dom,它包含一个PHP 的DOMDocument 实例。正在循环中设置和取消设置此变量。
unset($dom) 不会释放内存,但是:memory_get_usage(false) 报告说只有大约 10MB 的 700B 被释放。 memory_get_usage(true) 在unset() 之前和之后报告的内存使用量完全相同。
我尝试了以下方法:
在调用
unset():xdebug_debug_zval('dom')报告之前,我检查了$dom 的引用计数正好是1:dom: (refcount=1, is_ref=0)=class DOMDocument { }。我尝试了DOMDocument PHP Memory Leak 中提出的解决方案,但无济于事。
我试过
gc_enable()+gc_collect_cycles()。但这也无济于事。我尝试在
unset()之前调用$dom->__destruct(),但这会导致错误,因为 DOMDocument 显然没有析构函数。在取消设置变量之前,我递归地删除了 DOM 中的所有节点。没有任何区别。
我尝试在重新使用之前将变量设置为 null:
$dom = null
现在我没有想法了......有人建议我还能尝试调试或解决这个问题吗?
编辑:
php -v 使用 Suhosin-Patch (cli) 报告 5.3.10-1ubuntu3.2
-
前几次迭代的输出是:
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
【问题讨论】:
-
嗨..我面临同样的问题..你找到任何解决方法了吗?
-
对不起,我不记得了。我记得我没有找到合适的解决方案并以某种方式解决了它。
-
@JuniorMayhé:正如你在我原来的帖子中看到的,我已经链接到那个问题。这不是我的问题。我似乎记得它与 mysql 驱动程序(缓存的 SQL 语句)中的内存泄漏有关,但我不记得它是如何通过使用 DOM 模型触发的。
标签: php memory-leaks domdocument