2012-03-24 54 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()”。