2013-10-18 49 views
1

我必須分析大xml文件,大於2,1gb。PHP的Xmlreader movetoelement

我繼續使用Php,Xmlreader和自動化任務來每天進行更新。

我的服務器受到限制,自動化任務被限制爲一個小時。

在一小時內2,1gb是不可能的,我暫時不能更改我的服務器。

因此,我在我的數據庫中記錄了產品的最後一個編號,第二次更新,下一小時,我將最後一個編號記錄與xmlreader讀取的新記錄進行比較。如果數字相同,我繼續更新else(php失真),我移動到下一個節點,然後等待最後一個數字。

當第二次更新到達更新的節點的最後一個號碼時,是否有可能更快更簡單地進行更新?

實際的系統工作,但必須閱讀該文件,並花費時間來查找最後的產品編號保存。

我不會講英語很好,所以我希望你能理解。

XML文件的一部分:

我怎麼能去直接產品ID 3:

<?xml version="1.0" encoding="utf-8"?> 

<PRODUITS> 

    <PRODUIT id="1"> 

    <CAPACITE>4</CAPACITE> 

    <LOGEMENT><![CDATA[Résidence]]></LOGEMENT> 

    <HEBERGEMENT><![CDATA[Studio 4 personnes]]></HEBERGEMENT> 

    <REGION><![CDATA[Alpes du Nord]]></REGION> 

    <PAYS><![CDATA[France]]></PAYS> 

    <CODEPOSTAL>73500</CODEPOSTAL> 
    </PRODUIT> 

    <PRODUIT id="2"> 

    <CAPACITE>4</CAPACITE> 

    <LOGEMENT><![CDATA[Résidence]]></LOGEMENT> 

    <HEBERGEMENT><![CDATA[Studio 4 personnes]]></HEBERGEMENT> 

    <REGION><![CDATA[Alpes du Nord]]></REGION> 

    <PAYS><![CDATA[France]]></PAYS> 

    <CODEPOSTAL>73500</CODEPOSTAL> 
    </PRODUIT> 

    <PRODUIT id="3"> 

    <CAPACITE>4</CAPACITE> 

    <LOGEMENT><![CDATA[Résidence]]></LOGEMENT> 

    <HEBERGEMENT><![CDATA[Studio 4 personnes]]></HEBERGEMENT> 

    <REGION><![CDATA[Alpes du Nord]]></REGION> 

    <PAYS><![CDATA[France]]></PAYS> 

    <CODEPOSTAL>73500</CODEPOSTAL> 
    </PRODUIT> 
</PRODUITS> 

我在PHP的分析系統?

<?php 
if(file_exists("$file_xml")) 
{ 
    $reader = new XMLReader(); 
    $reader->open("$file_xml"); 

    while($reader->read()) 
    { 
    if(($reader->name === 'PRODUIT') && ($reader->nodeType==XMLReader::ELEMENT)) 
    { 
    $node = new SimpleXMLElement($reader->readOuterXML()); 


    $id= mysql_real_escape_string(utf8_decode($node['id'])); 

      // For the next update but TAKE TIME !! 
      if(($num!="3")) 
     { 
     // Nothing to do 
      } 
     else 
     { 
     $num = mysql_real_escape_string(utf8_decode($node['num'])); 
      ....       
     } 
    } 
    } 
$reader->close(); 
} 

?>

提前感謝!

回答

0

我用的XMLReader我的自我掙扎但這應該工作

if(($reader->nodeType==XMLReader::ELEMENT) && ($reader->name === 'PRODUIT')) 
{ 
    if($reader->getAttribute('id') === 3){ 
    //id is 3 
    } 
}