【问题标题】:PHP/DOMDocument: unset() does not release resourcesPHP/DOMDocument: unset() 不释放资源
【发布时间】: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

  • 源码可以看这里:https://github.com/jerico-dev/ojs/blob/dev/plugins/generic/lucene/classes/SolrWebService.inc.php#L256

  • 前几次迭代的输出是:

    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


【解决方案1】:

这应该会释放 $dom 中的内存存储。

$dom = null;

【讨论】:

  • 它“应该”?你测试了吗?
  • 你只是因为我的措辞而投了反对票吗?是的,它会重写内存。
  • 我没有否决您的回答。它没有赞成票,也没有反对票。 (您可以检查您的声誉历史来确定)。
  • 对不起,我已经试过了。我只是在我的清单中忘记了它。您也可以在源代码中看到它。它不起作用。
  • @Truth 啊好吧。我只是在同一时间看到了一个随机的反对票。抱歉!
猜你喜欢
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 2012-01-08
  • 1970-01-01
相关资源
最近更新 更多