使用PHP构建XML - 考虑性能

时间:2010-04-15 17:11:48

标签: php xml performance

在PHP中构建XML时,是否可以更快地构建字符串,然后回显字符串或使用php为您提供的XML函数?目前我正在做以下事情:

更新为更好的代码段:

$searchParam = mysql_real_escape_string($_POST['s']);
$search = new Search($searchParam);

if($search->retResult()>0){
    $xmlRes = $search->buildXML();
}
else {
    $xmlRes = '<status>no results</status>';
}

$xml = "<?xml version=\"1.0\"?>";
$xml.="<results>";
$xml.=$xmlRes;
$xml.="</results>"

header ("content-type: text/xml");
header ("content-length: ".strlen($xml));
echo($xml);


class Search {
private $num;
private $q;

function __construct($s){
    $this->q = mysql_query('select * from foo_table where name = "'.$s.'"');
    $this->num = mysql_num_rows($this->q);
}

function retResult(){
    return $this->num;
}

function buildXML(){
    $xml ='<status>success</status>';
    $xml.='<items>';
    while($row = mysql_fetch_object($this->q)){
        $xml.='<item>';
        $desTag = '<info><![CDATA[';
        foreach ($row as $key => $current){
            if($key=='fob'){
                //do something with current
                $b = mysql_query('select blah from dddd where id ='.$current);
                $a = mysql_fetch_array($b);
                $xml.='<'.$key.'>'.$a['blah'].'</'.$key.'>';
            }
            else if($key =='this' || $key=='that'){
                $desTag = ' '.$current;
            }
            else {
                $xml.='<'.$key.'>'.$current.'</'.$key.'>';
            }   
        }
        $desTag.= ']]></info>';
        $xml.=$desTag;
        $xml.='</item>';
    }
    $xml.='</items>';
    return $xml;
}

}

有没有更快的方法来构建xml?我得到大约2000件物品,它开始变慢..

提前致谢!

5 个答案:

答案 0 :(得分:6)

使用xml解析器。请记住,当您连接字符串时,必须在每个连接上重新分配WHOLE STRING。

对于小字符串,string可能更快,但在你的情况下肯定使用XML函数。

答案 1 :(得分:2)

我没有看到你在连接之前没有试图逃避文本。这意味着你迟早会生成一些差不多但不完全是XML的东西,并且会被任何符合标准的解析器拒绝。

使用库(XMLWriter可能比其他库更高效,但我还没有用PHP完成XML)。

答案 2 :(得分:1)

你在循环中有一个SQL查询,这通常是个坏主意。即使每个查询需要半毫秒才能完成,但执行这些2000查询仍然只需要一秒钟。

您需要做的是在一个新问题中发布这两个查询,以便有人可以告诉您如何使用JOIN将它们转换为单个查询。

数据库内容通常在很大程度上超过任何类型的微优化。无论是使用字符串连接还是XMLWriter,在执行数千次查询时都无关紧要。

答案 3 :(得分:0)

尝试在每次迭代中回显(在while循环结束之前放置echo $ xml,并在beggining重置$ xml),应该更快

答案 4 :(得分:0)

该代码段没有多大意义,请发布一些实际代码,以降低可读性。

您发布的代码的更快版本将是

$xml = '';
while ($row =  mysql_fetch_row($result))
{
    $xml .= '<items><test>' . implode('</test><test>', $row) . '</test></items>';
}

通常,使用mysql_fetch_object()比其他选项稍慢。

也许你想要做的就是这样:

$xml = '<items>';
while ($row =  mysql_fetch_assoc($result))
{
    $xml .= '<item>';
    foreach ($row as $k => $v)
    {
        $xml .= '<' . $k . '>' . htmlspecialchars($v) . '</' . $v . '>';
    }
    $xml .= '</item>';
}
$xml .= '</items>';

正如其他地方所提到的,除非你100%确定永远不会有任何特殊字符,例如“&lt;”,否则你必须逃避这些值。 “&gt;” 中或“&amp;”。这实际上也适用于$k。在这种脚本中,使用XML属性而不是节点通常也更有效。

由于关于您的目标的信息很少,我们所能做的就是微优化。也许你应该研究脚本背后的原理呢?例如,你真的必须生成2000个项目。你可以缓存结果吗,你能缓存什么吗?你不能对结果等进行分页......

关于使用PHP的XML库的快速说法,XMLWriter通常比使用字符串操作稍慢。其他一切都会明显慢于字符串。