在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件物品,它开始变慢..
提前致谢!
答案 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通常比使用字符串操作稍慢。其他一切都会明显慢于字符串。