减少saveXML的处理时间

时间:2013-04-26 10:52:54

标签: php domdocument

我使用PHP并且有两个APP。

一个名为APP-1的APP处理超过800,000行Oracle DB到XML文档。

另一个名为APP-2的APP,它将APP-1中的XML作为http响应并将数据显示为网页。

最大数据,APP-2可以请求APP-1是100,000行。

如果APP-2想要获得整个800,000行APP-2必须要求APP-1 8次。

现在我运行APP-2和APP-1。

APP-1在300秒内完成处理所有行。

现在我想知道如何减少处理时间。

APP-1使用saveXML生成XML。它平均需要25秒,总共需要180秒。这几乎是整个处理时间的一半。

另一方面,APP-2比APP-1快得多。

APP-2使用simplexml_load_string解析XML并更改为HTML。平均需要5秒,总共35秒。

我认为100,000行不是处理时间的关键因素,因为simplexml_load_string比saveXML快得多..

是否有任何好的解决方案可以减少saveXML部件的处理时间?

1 个答案:

答案 0 :(得分:2)

请注意,DOM文档需要相对较多的内存,因为整个文档树必须保存在内存中。 DOM适用于解析和操作现有的xml内容。如果您只需输出XML,我会建议使用文档。只是普通的字符串输出最适合。像这样:

echo '<?xml version="1.0"?>';
echo '<data>';
while($row = $result->fetchRecord()) {
    echo '<row>
            <foo><![CDATA[' . $ow['foo'] . ']]></foo>
            <bar><![CDATA[' . $row['bar'] . ']]></bar>
          </row>';
}
echo '</data>';

您可以使用输出缓冲来提高性能:

ob_start(4096); // start buffering of output using a 4096 bytes sized buffer

echo '<?xml version="1.0"?>';
echo '<data>';
while($row = $result->fetchRecord()) {
    echo '<row>
            <foo><![CDATA[' . $ow['foo'] . ']]></foo>
            <bar><![CDATA[' . $row['bar'] . ']]></bar>
          </row>';
}
echo '</data>';

ob_end_flush();

请注意,如果您的数据库中的内容可能包含]]>之类的内容(关闭CDATA部分的内容,必须在使用前对其进行转义。如果您有二进制数据,情况尤其如此。