我正在尝试使用DomDocument
解析HTML页面,但是当我尝试调用loadHTML()
函数时,我得到以下PHP错误:
允许的内存大小为134217728字节已耗尽(尝试分配)32983304字节)
返回HTML的strlen()
得到357878
。
如果一个UTF-8字符是1字节,那么HTML字符串的大小是0.3MB。然而,根据PHP错误,DomDocument
试图分配31.5MB!
这就是我所做的:
$dom = new 'DomDocument;
$dom->loadHTML($html);
die;
这正常吗?
更新:
我发现添加:
libxml_use_internal_errors(true);
使它开始工作!
我不知道这个测试是否准确,但我试着把它添加到我的类的构造函数中(这是一个非常轻量级的类,没有做太多的事情):
$this->startingMemoryUsage = memory_get_usage(true);
$dom->loadHtml()
:
echo (memory_get_usage(true) - memory_get_usage());
输出为:
561360
是0.5MB——根据我之前的HTML字符串大小计算,它应该是差不多的。
所以,出于某种原因,它似乎DomDocument试图分配大量的内存,当我没有libxml_use_internal_errors(true)
,但当我添加那一行它神奇地开始工作。
如果您使用的是libxml_use_internal_errors(true);
,那么这就是内存泄漏的原因,因为错误列表正在增长。