2014-09-11 134 views
0

我檢查了很多問題,但沒有得到答案。解析大XML文件

我有一個很大的XML文件,我需要解析。目前我正在用XMLReader解析它。它運行良好,直到我開始將它插入SQL數據庫。如果我只回聲解析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

+0

由於問題出現在您開始向數據庫中插入內容時,分享該部分代碼可能會很有趣。沒有數據庫過程需要多長時間? – Sugar 2014-09-11 08:20:42

+0

我在一分鐘內分享它,沒有數據庫過程它並不需要很長時間。我想到了另外一件事,在得到504網關超時之後,我無法訪問我網站的任何部分,我認爲整個服務器超時。幾分鐘後(15-20)服務器開始正常運行,XML文件存儲在db中。 http://pastebin.com/S8A5Rdjw - 這是我的功能。 – 2014-09-11 08:26:05

+0

您使用的是Apache還是NGINX?你有沒有嘗試增加PHP超時限制?如果沒有,請嘗試在腳本的頂部放置'set_time_limit(0);'。 – CrazySabbath 2014-09-11 08:42:18

回答

1

序列化的過程中會降低內存消耗,但會增加運行時間。但我不認爲時間是這裏的問題。

您可能只是通過許多插入語句來阻止對數據庫(表)的訪問。

一些提示:如果那樣的動作不是由框架支持

  1. 使用數據庫進口框架可能會很慢。儘量避免數據庫抽象。

  2. 確保使用質量塊插入。大多數數據庫允許以某種方式一次插入多個記錄。這減少了數據庫調用。 (當然在增加所需的內存,所以你將不得不尋找一個平衡。)

  3. 檢查插入不會阻止選擇。取決於數據庫和MySQL處理器的情況。

  4. 插入到單獨的表中,然後重命名錶。

  5. 生成文件並使用數據庫命令行客戶端導入它。