如何使用php处理比较大的xml文件?


说下具体问题:
需要从别的网站抓取xml文件,比如用curl抓取然后处理。
目前碰到的问题是,抓取并处理时,由于xml文件比较大,因此会造成 处理时间长、cpu占用高、内存占用多 的问题。
该如何解决这3个问题呢?之前考虑分片处理xml,但是没有什么好的方案。

补充一下:需要考虑内存占用、CPU占用。由于服务器比较烂,目前我处理500k以上的xml,使用SimpleXML来做已经有点支撑不住了,所以才会考虑能不能对xml文件进行分段读取拆分解析。

附上一个xml文件供测试:

http://www.meituan.com/api/v2/beijing/deals

xml php

流放與王國 12 years, 3 months ago

PHP中有两种主要的XML解析器

1)基于树的解析器。它是把整个文档存储为树的数据结构中,即需要把整个文档都加载到内存中才能工作。所以,当处理大型XML文档时候,性能剧减。SimpleXML和DOM扩展属于此类型解析器。

2)基于流的解析器。它不会一次把整个文档加载到内存中,而是每次分别读取其中的一个节点并允许实时与之交互(当移向下一个节点时,上一个节点是被丢弃,但也设置为保留)。很明显,其效率要高且占内存少,不便之处代码量大点。

所以,PHP中处理大型XML文档可以用XMLReader扩展方案(基于流的解析器)。它在PHP 5.1中默认是启用的。

以下是示例:

   
  <?php
  
$xml_file = file_get_contents('http://www.meituan.com/api/v2/beijing/deals');
// 创建对象
$reader = new XMLReader();
// 从一个文档或URL中加载XML数据
$reader->open($xml_file);
// 遍历
while($reader->read()) {
// statement
}
?>

kos... answered 12 years, 3 months ago

Your Answer