使用simplexml对xml数据源进行“高效”调用

时间:2013-02-03 14:32:50

标签: php xml caching simplexml

我使用xml数据源使用simplexml获取信息,然后使用该数据生成页面。

为此我使用

获取xml提要
$xml = simplexml_load_file

我是否正确地认为要解析xml数据,服务器必须先将其下载才能使用它?

显然这对2kb文件没有这样的问题,但有些文件接近100kb,所以对于每个页面加载必须先下载才能开始生成页面。

在某些页面上只查找xml数组的1个属性,因此解析整个文档似乎是unessarcery,通常我会考虑缓存feed,但这些feed与经常更改的live makets有关,所以不是理想,因为我总是有最新的数据。

有没有更好的方法来更有效地调用xml提要?

1 个答案:

答案 0 :(得分:3)

优化XML解析的第一个策略之一是即时解析 - 这意味着,不要等到整个数据到达,并在需要解析时立即开始解析

这样效率更高,因为瓶颈通常是网络连接,而不是CPU,所以如果我们能够在不等待所有网络信息的情况下找到答案,我们就会进行相当优化。

您应该使用术语XML push parserXML 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