解析大XML文件

时间:2014-09-11 08:13:45

标签: php xml

我查了很多问题,但没有得到答案。

我有一个需要解析的大型XML文件。目前我正在使用 XMLReader 解析它。在我开始将其插入SQL db之前,它一直运行良好。如果我只回显解析xml它工作正常,如果我插入它我会得到 504网关超时 错误。以下是我的代码示例:

我在哪里解析xml:

$xml = new XMLReader();
$xml->open(APP_PATH_OWA."/trnUpload/TRNavteraData.xml");

while($xml->read()){
 //get products
 if($xml->nodeType == XMLREADER::ELEMENT && $xml->localName == 'table'){    
    $product = array();
 }

 if($xml->nodeType == XMLREADER::ELEMENT && $xml->localName == 'ident'){
    $xml->read();
    $product['id'] = $xml->value;
 }
    ...

FOREACH:

foreach($products as $product){
  ...
 $productTitle = $product['title'];
 $productID = $product['id'];
 $productImageUrl = "http://www.example.com/logo.png";
 $productAttrHtml = $product['computed'];

 // after that I'm inserting those data using ZEND framework.

XML文件大约是300k +行。

整个php函数:http://pastebin.com/S8A5Rdjw

1 个答案:

答案 0 :(得分:1)

序列化进程将减少内存消耗,但会增加运行时。但我认为时间不是问题所在。

您可能只使用许多插入语句来阻止对数据库(表)的访问。

一些提示:

  1. 如果框架不支持这种操作,使用框架进行数据库导入可能会非常慢。尽量避免数据库抽象。

  2. 确保使用质量插入物。大多数数据库允许以这种或那种方式一次插入多个记录。这减少了数据库调用。 (当然,增加所需的记忆,所以你必须找到平衡。)

  3. 检查插入是否阻止选择。取决于数据库以及表处理程序上MySQL的情况。

  4. 插入单独的表格并在此之后重命名表格。

  5. 生成文件并使用databases命令行客户端导入它。