加快在PHP中读取多个XML文件

时间:2011-12-14 03:09:09

标签: php xml performance optimization simplexml

我目前有一个必须读取数百个XML文件的php文件,我没有选择如何构建这些XML文件,它们是由第三方创建的。

第一个xml文件是其余xml文件的大量标题,因此我搜索第一个xml文件以获取其余xml文件的文件名。

然后我读取每个xml文件,搜索其特定短语的值。

这个过程非常慢。我正在谈论5 1/2分钟的运行时间......对于一个网站而言,这是不可接受的,客户不会长时间待在这里。

有没有人知道一种可以加速我的代码的方法,最大运行时间大约为30秒。

以下是我的代码的粘贴框:http://pastebin.com/HXSSj0Jt

谢谢,抱歉难以理解的英语......

2 个答案:

答案 0 :(得分:1)

首先,如果您必须为服务的每个请求处理大型xml文件,那么下载xml一次,预处理并在本地缓存它们是明智的。

如果你不能预处理和缓存xml并且必须为每个请求下载它们(我不相信是这种情况)你可以尝试使用XMLReader或一些基于SAX事件的xml解析器进行优化。 SimpleXML的问题在于它正在使用DOM。 DOM(正如字母所代表的)在php进程内存中创建文档对象模型,这需要花费大量时间并占用大量内存。我冒险说DOM对于解析大型XML文件毫无用处。

而XMLReader将允许您逐个遍历大型XML节点,而不会因为您无法发出xpath查询或任何其他非重复节点访问模式而牺牲任何内存。

如何使用xmlreader,您可以咨询php manual for XMLReader extension

答案 1 :(得分:1)

您的主要问题是您正在尝试进行数百次http下载以执行搜索。除非你摆脱这种限制,否则它只会走得那么快。

如果由于某种原因文件无法在中完全(不太可能),甚至在某些时候都没有,您可以通过并行下载来获得一些速度。请参阅curl_multi _ *()函数。或者,使用 xargs 命令行中的 wget 并行下载。

如果你有任何类型的流量,上面的声音听起来很疯狂。

最有可能的是,文件可以缓存至少很短的时间。查看http标头,看看他们的服务器发送了哪种新鲜度信息。它可能会说文件到期之前有多长时间,在这种情况下,您可以在此之前将其保存在本地。或者,它可能会给出最后修改或etag,在这种情况下,您可以执行条件获取请求,这应该可以加快速度。

我可能会设置一个本地squid cache并让php通过squid发出这些请求。如果它是新的,或者有条件地为您检索新的版本逻辑,它将负责所有使用本地副本。

如果您仍想获得更高的性能,可以将缓存的文件转换为更合适的格式(例如,将相关数据粘贴到数据库中)。或者如果你必须坚持使用xml格式,你可以先对文件进行字符串搜索,以测试是否应该将该文件解析为xml。