【问题标题】:PHP simple_dom_html memory leakPHP simple_dom_html 内存泄漏
【发布时间】:2017-01-28 01:07:00
【问题描述】:

所以,我使用simple_dom_html library 来解析 HTML,但是,因此存在少量内存泄漏。泄漏很小,但是,我经常使用这个库,仅用了 2 天,我的服务器就从这次泄漏中达到了 16 GB 的内存使用量,这是一个大问题。

为了澄清,我在使用$doc->clear();unset($doc);之后,但是内存没有清除。

str_get_html之前:649512

$doc->clear()之前:9773480

$doc->clear()$doc = NULL 之后:1127184

在所有事情上致电unset 后:855664

(这些以字节为单位 - memory_get_usage() 返回的内容)

我想说明我使用的是str_get_html。我已经在谷歌、这个网站和其他类似网站上寻找了几个小时的解决方案,但似乎没有任何东西可以解决我的问题。如果您需要更多信息,请在下方评论。

究竟为什么会发生这种内存泄漏?这是我正在运行的脚本:

gc_enable();
echo "before str_get_html: ".memory_get_usage()."<br><br>";
$doc = str_get_html($response);

echo "before \$doc->clear(): ".memory_get_usage()."<br><br>";
$doc->clear();
$doc = NULL;

echo "after \$doc->clear() and nullifying: ".memory_get_usage()."<br><br>";
unset($response);

unset($doc);

echo "after unsetting everything: ".memory_get_usage()."<br><br>";

这是我的内存使用情况的屏幕截图:http://prntscr.com/ck4s78 - 图表停止的部分是 10 小时停机时间,因为这在我睡觉时使我的服务器崩溃。我在 17 日开始使用 simple_html_dom,也就是泄漏开始的时候。在 18 日到 19 日之间,我停止使用它几个小时,泄漏停止,图形再次变成一条直线(正常 ram 使用)。

【问题讨论】:

    标签: php parsing memory memory-leaks garbage-collection


    【解决方案1】:

    首先 unset($html);不释放内存,PHP 自己做。 如果您可以向我们展示您的泄漏内存的脚本,也许我们可以提供更多帮助

    【讨论】:

    • 我更新了问题,并添加了我正在使用的确切 PHP 文件。忽略cURL的东西,它与问题无关,我已经检查了3次并且cURL没有泄漏内存。 cURL 只是为了让我可以解析 HTML。
    • 实际上,我将代码简化为尽可能少的行 - 内存泄漏仍有待澄清。
    • 我制作了巨大的 html 并用您的代码对其进行了测试,结果是:在 str_get_html 之前:1410056 在 $doc->clear() 之前:17288560 在 $doc->clear() 之后并取消:1878864 之后解除一切:1536456 clear 工作,互联网上有很多关于这个库内存泄漏的信息。对于解析,我使用 DOM 核心 PHP 库并且从未发生过内存泄漏
    • 实际上存在一个单独的带有 DOMDocument 的内存泄漏,已通过清除 libxml 错误得到修复。我犹豫使用 DOMDocument 的唯一原因是因为我喜欢 simple_html_dom 的 CSS 选择器的简单性。我想切换到 DOMDocument 会是一个更好的主意——不过仍然很好奇为什么会发生这种泄漏。
    猜你喜欢
    • 1970-01-01
    • 2016-02-10
    • 2023-03-17
    • 2012-04-17
    • 2012-01-12
    • 2016-03-30
    • 1970-01-01
    • 2013-09-02
    • 2014-09-22
    相关资源
    最近更新 更多