我使用xml数据源使用simplexml获取信息,然后使用该数据生成页面。
为此我使用
获取xml提要$xml = simplexml_load_file
我是否正确地认为要解析xml数据,服务器必须先将其下载才能使用它?
显然这对2kb文件没有这样的问题,但有些文件接近100kb,所以对于每个页面加载必须先下载才能开始生成页面。
在某些页面上只查找xml数组的1个属性,因此解析整个文档似乎是unessarcery,通常我会考虑缓存feed,但这些feed与经常更改的live makets有关,所以不是理想,因为我总是有最新的数据。
有没有更好的方法来更有效地调用xml提要?
答案 0 :(得分:3)
优化XML解析的第一个策略之一是即时解析 - 这意味着,不要等到整个数据到达,并在需要解析时立即开始解析
这样效率更高,因为瓶颈通常是网络连接,而不是CPU,所以如果我们能够在不等待所有网络信息的情况下找到答案,我们就会进行相当优化。
您应该使用术语XML push parser
或XML pull parser
在文章Pull parsing XML in PHP - Create memory-efficient stream processing中,您可以找到一个教程,该教程使用与PHP5捆绑在一起的XMLReader库显示有关如何使用PHP的一些代码
这是这个页面的引用,基本上说的是我刚才用更好的词语做的:
PHP 5引入了XMLReader,这是一个用于读取可扩展标记语言(XML)的新类。与SimpleXML或文档对象模型(DOM)不同,XMLReader以流模式运行。也就是说,它从头到尾读取文档。在最后看到内容之前,您可以在开头处理内容。这使得它非常快速,非常高效,并且对记忆非常简约。您需要处理的文档越大,这就越重要。
在流模式下解析与过程解析略有不同。请记住,所有数据都不存在。您通常需要做的是提供实现某种状态机的事件处理程序。如果您看到标记A,请执行此操作,如果您看到标记B,请执行此操作。
关于推送解析和拉解析之间的区别,请查看this article。简而言之,两者都是基于流的解析器。您可能需要一个推送解析器,因为您希望在数据从XML Feed通过网络到达时进行解析。
在PHP中推送解析也可以使用xml_parse()
(libexpat与libxml兼容层)完成。您可以看到代码示例xml_parse
PHP manual page。