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

在PHP中加速读取多个XML文件,php,xml,performance,optimization,simplexml,Php,Xml,Performance,Optimization,Simplexml,我目前有一个php文件,必须读取数百个XML文件,我没有选择如何构造这些XML文件,它们是由第三方创建的 第一个xml文件是其余xml文件的大量标题,因此我搜索第一个xml文件以获取其余xml文件的文件名 然后,我读取每个xml文件,搜索其值以查找特定短语 这个过程真的很慢。我说的是5分半钟的运行时间。。。这对于一个网站来说是不可接受的,客户不会停留那么长时间 有没有人知道一种方法可以将我的代码加速到最大运行时间约30秒 这是我的代码的粘贴箱: 谢谢,很抱歉我的英语听不懂 首先,如果您必须为每个

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

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

然后,我读取每个xml文件,搜索其值以查找特定短语

这个过程真的很慢。我说的是5分半钟的运行时间。。。这对于一个网站来说是不可接受的,客户不会停留那么长时间

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

这是我的代码的粘贴箱:


谢谢,很抱歉我的英语听不懂

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

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

然而,XMLReader将允许您逐个节点地遍历大型XML,而无需消耗任何内存,同时,您也无法发出xpath查询或任何其他非顺序节点访问模式


如何使用xmlreader您可以咨询

您的主要问题是,您试图通过数百次http下载来执行搜索。除非你取消这个限制,否则它只会发展得这么快

如果由于某种原因,文件根本不可缓存(不太可能),甚至在某些时候,您可以通过并行下载来提高速度。请参见curl_multi_*()函数。或者,使用命令行中的wget和xargs并行下载

不过,如果你有任何流量的话,以上这些听起来都很疯狂

最有可能的是,这些文件可以缓存至少很短的时间。查看http头并查看服务器发送的新鲜度信息。它可能会显示文件过期的时间,在这种情况下,您可以将其保存在本地,直到过期。或者,它可能会给出一个最后修改的或etag,在这种情况下,您可以执行条件get请求,这应该会加快速度

我可能会建立一个本地数据库,让php通过squid发出这些请求。如果本地副本是新的,它将负责所有的操作,或者有条件地为您检索新版本逻辑


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

我有一个cachegrind.out,需要花费时间的部分是SimpleXMLElement->\u构造。这平均需要1.98秒,这将是大部分下载时间。尝试将下载和xml解析分开,使用file_get_contents()或curl来支持gzip。下载时间并不总是那么简单。如果XML很大,在使用DOM/SimpleXML的情况下,用XML构建DOM需要大量内存和时间。因此,如果无法避免处理大型XMLs,那么流式(XMLReader)/基于事件(SAX)解析器是唯一的选择。DOM在这样的场景下工作不太好。cron在数据库中的工作非常有效。我已经查看了标题,我认为我最好每月更新一次缓存。我将如何构建这样的缓存?我需要在本地下载所有500个左右的xml文件,然后确保每个月都更新这些文件……我只需要制作一个包含“tripcode”、“country”和“xml”字段的数据库表。每月通过cron作业运行一次php脚本以更新数据库。现在,您可以快速搜索数据库。