【问题标题】:making 'efficient' calls to xml data feed with simplexml使用 simplexml 对 xml 数据源进行“高效”调用
【发布时间】:2013-02-03 14:32:49
【问题描述】:

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

为此我使用

获取 xml 提要
$xml = simplexml_load_file

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

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

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

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

【问题讨论】:

  • 只需要一点常识就可以计算出您需要多久更新一次信息。如果必须显示来自 XML 提要的信息 100% 是最新的(例如实时股票价格提要),那么您应该每次下载新文件。另一方面,如果您不需要最新信息,为什么不在您的服务器上存储一个本地副本并根据需要经常更新它呢?如果总是这样,您总是需要一小部分信息,只需存储您需要的任何变量,而不是整个文件。
  • 你可以衡量它。一个 100kb 的文件在这种情况下我不会认为大 BTW,这样说:实际上检查你是否在这里靠墙跑,你可能想知道没有用。您可能正在寻找正则表达式。

标签: php xml caching simplexml


【解决方案1】:

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

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

PHP 中的推送解析也可以使用xml_parse()(带有 libxml 兼容层的 libexpat)来完成。可以看代码示例xml_parse PHP manual page

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多