PHP原生DOM文档和简单DOM解析器-大小有限制吗?

PHP原生DOM文档和简单DOM解析器-大小有限制吗?,php,domdocument,Php,Domdocument,我需要解析HTML文档的内容(由Microsoft Word生成)。遍历DOM以获取所需的信息/内容,然后将所需内容输出为CSV。我知道几乎没有脑部手术 现在,由于PHP不是我真正喜欢的东西,而且我的日程安排很紧,所以我打算使用 我注意到我的脚本不起作用。经过反复试验,我意识到这是由于Word生成的HTML文件的文件大小造成的(它们是3MB,有多达30000行HTML!)。我假设可以使用PHP简单HTML-DOM解析器或者原生PHP-DOMDocument-API解析的内容有一个文件大小限制?如

我需要解析HTML文档的内容(由Microsoft Word生成)。遍历DOM以获取所需的信息/内容,然后将所需内容输出为CSV。我知道几乎没有脑部手术

现在,由于PHP不是我真正喜欢的东西,而且我的日程安排很紧,所以我打算使用

我注意到我的脚本不起作用。经过反复试验,我意识到这是由于Word生成的HTML文件的文件大小造成的(它们是3MB,有多达30000行HTML!)。我假设可以使用PHP简单HTML-DOM解析器或者原生PHP-DOMDocument-API解析的内容有一个文件大小限制?如果是这样的话,有人知道这个极限是多少吗?我已经在谷歌上搜索了40分钟,但没有成功

也许我应该使用Node.js?

PHP“Native”,它的小妹妹没有硬编码的大小限制,但它们受到允许PHP使用的内存的限制(请参阅)

此外,您不能假设加载一个100 MB的XML或HTML文件将消耗相同大小的内存。它通常比文件大小小得多(例如,五分之一或十分之一,甚至更多,取决于XML,因此您不能在这里只说因子X,如果您想要获得精确的信息,您需要度量自己的大小)

我想说,你在问题中给出的文件大小——3MB——相当小。对于互联网上的HTML文件来说可能不算小,但对于基于PHP的扩展来说却很小。通过使用加载文件时,可以了解PHP中的内存使用情况

如果您有非常大的XML文件——通常是X(HT)ML——比方说1.5GB——使用DOMDocument进行解析将花费大量的准备时间。然后使用将允许您解析文档,而无需将其加载到内存中(完全)。但这并不是什么灵丹妙药,因为您仍然有解析时间,但您可以更好地控制要解析的内容和要跳过的部分,这样您就有更多的空间来控制PHP用户区中的优化


PHP库也没有施加特定的大小限制。然而,它不是PHP的二进制扩展,而是在PHP用户区中。因此,您需要更好地了解该库的具体功能(请参阅)。如果您查看代码,您可以看到它是一个纯粹用PHP编写的解析器。这是因为它最初是为PHP4编写的,其中
DOMDocument
DOMDocument::loadHTML
还不存在

可以想象,PHP扩展可以比用PHP代码编写的PHP库更好地管理内存。特别是当涉及到HTML文档对象模型的树结构时(这句话本身并不正确,但是开发这种内存优化需要大量工作和良好的设计,这并不总是易于创建和维护)

然而,由于许多年来,现在已经没有必要再使用那个图书馆了。许多PHP用户不知道这一点,他们发现使用这个曾经流行的库的过时代码示例。在Stackoverflow上,库PHP Simple HTML DOM解析器甚至不时得到建议


因此,我能给出的最好建议是:除非您不需要编写与PHP4兼容的代码,否则不要使用该库,也不要关心它的限制。而是将代码移植到。PHP简单HTML DOM解析器的限制为600KB

define('MAX_FILE_SIZE', 600000);

当然,您可以编辑库的副本并更改此常量。

3MB和30000行HTML不应该对ext/DOM造成问题。我不能告诉您PHP Simple HTML DOM解析器的限制,因为我通常不使用它,因为我认为它是多余的。您可能希望删除Word HTML的一些缺陷(如果您没有在较新版本的Word中使用专用的HTML导出选项,因为我多年来一直使用Open Office和friends,并且不再存在这些问题,所以我从未升级到该版本),您可以使用。这对于中间解决方案可能是好的。我通常使用DOMDocument/SimpleXML来处理这种大小的文档(我使用SimpleHTMLDOM解析器已经有好几年了,我可以说它工作得很好,只是需要一些调整来减少内存使用(现在都是通过引用)和智能搜索缓存。我在框架中使用它将XML/HTML合并到模板中以生成HTLM页面。很好的一点是,您可以使用类似jQuery/CSS的语法。无需优化(例如,通过引用参数传递)它很容易达到20MB到30MB的内存使用量。通过优化,它的内存使用量会超过4到7MB,具体取决于文档资源的大小。因此,它很好,但需要一些调整。我使用简单的HTML DOM解析器已有几年了,我可以说它工作得很好,只是需要一些调整来减少内存使用量(所有内容现在都通过引用)和智能搜索缓存。我在框架中使用它将XML/HTML合并到模板中以生成HTLM页面。很好的一点是,您可以使用类似jQuery/CSS的语法。无需优化(例如,通过引用参数传递)它很容易达到20MB或30MB的内存使用量。通过优化,它会超过4到7MB,具体取决于您的资源大小。因此,它很好,但需要一些调整。@Erwinus:DOMDocument有xpath——通常比CSS选择功能强大得多——但如果您喜欢CSS选择器,有许多适配器库允许您使用CSS选择器ead。几个月后我第一次在这里看到你的评论。哇!谢谢你的洞察力。我从一些URL的文件_get_html()中没有得到任何结果,看起来问题出在html文件大小限制上。我增加了限制,现在它可以将URL内容很好地提取到dom中。谢谢@Barmar