1

我使用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 的处理时间吗?

4

1 回答 1

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 部分,则必须在使用前对其进行转义。如果您有二进制数据,情况尤其如此。

于 2013-04-26T11:02:55.233 回答