0

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

为此,我正在使用获取 xml 提要

$xml = simplexml_load_file

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

显然,对于 2kb 的文件,这不是这样的问题,但有些文件接近 100kb,因此对于每个页面加载,必须首先下载,然后 php 才能开始生成页面。

在某些页面上只寻找 xml 数组的 1 属性,因此解析整个文档似乎并不重要,通常我会考虑缓存提要,但这些提要与经常变化的实时市场有关,因此并不理想,因为我总是有最新的数据。

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

4

1 回答 1

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,请执行此操作。

关于推送解析取解析的区别看这篇文章。长话短说,两者都是基于流的解析器。您可能需要一个推送解析器,因为您想在数据从 XML 提要通过网络到达时进行解析。

PHP 中的推送解析也可以使用xml_parse()(带有 libxml 兼容层的 libexpat)来完成。您可以查看代码示例xml_parsePHP 手册页

于 2013-02-03T15:06:09.290 回答