2012-03-24 53 views
0

我想從mysql數據查詢中創建一個xml文件。從mysql數據創建xml文件到緩慢

這部分效果很好,但在15秒左右創建一個大約5000行的文件非常慢。

在apache服務器上,壓縮被激活。

見我的代碼:

$recordset = mysql_query($query, $link); 

$dom = new DOMDocument('1.0', 'UTF-8'); 
$rootNode= $dom->appendChild($dom->createElement('DatabaseDB')); 

while($row_recordset = mysql_fetch_row($recordset)) 

{ 

    $record = new DomElement("p", ""); 
    $rootNode->appendChild($record); 

    $record->SetAttribute("id", utf8_encode($row_recordset[0])); 
    $record->SetAttribute("np", utf8_encode($row_recordset[1])); 
    $record->SetAttribute("pr", utf8_encode($row_recordset[8])); 
    $record->SetAttribute("d1", utf8_encode($row_recordset[2])."/".utf8_encode($row_recordset[3])); 
    $record->SetAttribute("dn", (datefr($row_recordset[4]))); 
    $record->SetAttribute("tel", utf8_encode($row_recordset[5])); 

    $record->SetAttribute("st", utf8_encode($row_recordset[6])." - ".(datefr($row_recordset[7]))); 


} 
mysql_free_result($recordset); 
mysql_close(); 

print $dom->saveXML(); 

如果你有一個想法的加載速度,我很高興。 感謝

根據答案,我嘗試:

$writer = new XmlWriter(); 

$writer->setIndent(true); 
$writer->openURI('php://output'); 
$writer->startDocument('1.0', 'utf-8'); 
$writer->startElement('DatabaseDB'); 
while($row_recordset = mysql_fetch_row($recordset)) 

{ 

    $writer->startElement('p'); 
    $writer->writeAttribute("id", utf8_encode($row_recordset[0])); 
    $writer->writeAttribute("np", utf8_encode($row_recordset[1])); 
    $writer->writeAttribute("pr", utf8_encode($row_recordset[8])); 
    $writer->writeAttribute("d1", utf8_encode($row_recordset[2])."/".utf8_encode($row_recordset[3])); 
    $writer->writeAttribute("dn", (datefr($row_recordset[4]))); 
    $writer->writeAttribute("tel", utf8_encode($row_recordset[5])); 
    $writer->writeAttribute("st", utf8_encode($row_recordset[6])." - ".(datefr($row_recordset[7]))); 

    $writer->endElement(); 
} 
$writer->endElement(); 
$writer->flush(); 

但是,隨着的DomDocument,它需要大約787-9創建文件(5000行),用的XmlWriter是角落找尋787-8。

你有一個新的想法來優化? 謝謝 所以,表演不是更好。

+0

對我來說都很好,查詢執行時間呢?在這裏做什麼datefr函數?使用[確定執行時間代碼]來確定實際時間。從新的DOMDocument行開始它。 – 2012-03-24 00:44:54

+0

其中之一,你真的需要'utf8_encode'嗎?你在處理什麼編碼? – deceze 2012-03-24 00:45:06

+0

你的問題幾乎肯定來自查詢,而你沒有附加它,所以很難在這裏幫助你:) – haltabush 2012-03-24 01:53:15

回答

1

DOM和SimpleXML擴展的問題在於,它們在大量內存中運行,然後在完成時寫入磁盤。根據查詢的大小,當您應該將流式傳輸到文件時,您可能會分頁或花費太多時間管理內存。

查看XMLWriter()類。設置一個文件輸出,當你在行中讀取時,你將直接將XML寫入文件。在大型數據集上可能會快得多並且效率更高。確保你使用輸出文件而不是內存選項。然後,當你完成時,只需要readfile()你創建的文件來模擬你的「print $ dom-> saveXML()」。