在Apache Server上通过php / ajax查询大型xml文件时的性能问题

时间:2010-04-28 19:26:08

标签: php xml ajax apache

我有一个简单的“实时搜索”(打字时显示的结果)网站。这个组成是Ajax到PHP查询一个非常大的XML文档(10,000多行)。这一切都托管在本地Apache服务器(xamp)上。 xml文档的规模似乎导致了巨大的性能问题,结果需要10秒才能得出结果。

我是PHP的新手(这实际上是我的第一个游戏)所以下面是一段代码,以防有明显的事情

    for($i=0; $i<($foodListXML->length); $i++){
  $type=$foodListXML->item($i)->getElementsByTagName('type');
  $foodnote=$foodListXML->item($i)->getElementsByTagName('foodnote');
  $style=$foodListXML->item($i)->getElementsByTagName('style');

  if ($type->item(0)->nodeType==1)
    {
    //find a link matching the search text
    if (stristr($type->item(0)->childNodes->item(0)->nodeValue,$q)){
     $currentFoodName = $type->item(0)->childNodes->item(0)->nodeValue;
     $currentFoodStyle = $style->item(0)->childNodes->item(0)->nodeValue;
     $currentFoodNote = $foodnote->item(0)->childNodes->item(0)->nodeValue;

      if ($hint==""){
        $hint= $currentFoodName . " , " . $currentFoodNote .  " , <b>" . $currentFoodStyle. "</b>" .   "<br>" ;
        }
      else{
        $hint=$hint . $currentFoodName . " , " . $currentFoodNote . " , <b>" . $currentFoodStyle. "</b>" .   "<br>" ;
        }

      }
    }
  }
}

此外,如果将数据存储在数据库中并且访问速度更快,那么我对此持开放态度......所有想法都真的!!

感谢。

更新

根据要求,这里是XML,并且如下所述1000次;)

 <foodtype>
  <type>Pigeon,cooked</type >
  <foodnote>1 oz.</foodnote >
  <foodStyle>Crisp, Blah</foodStyle >
 </foodtype>

4 个答案:

答案 0 :(得分:1)

我打赌你的很多速度问题都与你每次搜索更新时迭代并获得每个条目的一些成员有关。

我不确定您的XML文件是如何设置的(您可能希望发布一个代码片段,这样我们就不必从代码中猜测),而是在页面加载时将其加载到内存和PHP数组中(甚至当服务器启动时,如果你可以保持缓存),那么从那里抓取可能是一个更好的解决方案。

你还提到你正在使用AJAX。你有可能把它全部发送到客户端并允许他们的脚本处理查找(类似于Doxygen文档中的javascript搜索)。这将减轻您的服务器负担,可能是一个更简单的解决方案(您只需发送一个脚本和XML文件)。

编辑:如果绝对不可能,那么这段代码应该更快一点:

for($i=0; $i<($foodListXML->length); $i++)
{
    $type=$foodListXML->item($i)->getElementsByTagName('type');
    if ($type->item(0)->nodeType==1)
    {
        // move these in here, so if the nodeType is wrong, don't bother looking them up
        $foodnote=$foodListXML->item($i)->getElementsByTagName('foodnote');
        $style=$foodListXML->item($i)->getElementsByTagName('style');

        //find a link matching the search text
        if (stristr($type->item(0)->childNodes->item(0)->nodeValue,$q))
        {
            $currentFoodName = $type->item(0)->childNodes->item(0)->nodeValue;
            $currentFoodStyle = $style->item(0)->childNodes->item(0)->nodeValue;
            $currentFoodNote = $foodnote->item(0)->childNodes->item(0)->nodeValue;

            if ($hint=="")
            {
                $hint= $currentFoodName . " , " . $currentFoodNote .  " , <b>" . $currentFoodStyle. "</b>" .   "<br>" ;
            } else {
                $hint=$hint . $currentFoodName . " , " . $currentFoodNote . " , <b>" . $currentFoodStyle. "</b>" .   "<br>" ;
            }
        }
    }
}

答案 1 :(得分:1)

多德。 Deffo使用数据库。

如果你有一个10,000以上的XML,那么循环当然需要很长时间,而if / else语句在那个级别上可能很昂贵。

数据库专为此类查询而设计,只需几分之一秒即可获取信息。

此外,这样做会乘以执行此操作的用户数 - 如果他们都使用XML扫描功能,您的服务器会在夜幕降临之前尖叫。

答案 2 :(得分:1)

伙计,你肯定需要阅读一位SO创始人Joel Spolsky撰写的旧文章Back to basics 它很好地解释了这些事情

答案 3 :(得分:0)

我不确定问题是什么,所以我会解决您对数据库的评论:如果您的目标是在10,000多行数据中查找内容,那么,数据库比现有的解决方案容易提高一百或一千倍。