Проблема с производительностью при запросе большого XML-файла через php / ajax на Apache Server - PullRequest
0 голосов
/ 28 апреля 2010

У меня есть простой "живой поиск" (результаты отображаются при наборе текста) веб-сайта. Это Ajax to PHP, который запрашивает довольно большой XML-документ (более 10000 строк). Все это размещено на локальном сервере 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>" ;
        }

      }
    }
  }
}

Кроме того, если у вас есть данные в БД и доступ к ним более быстрый, тогда я открыт для этого ... Все идеи действительно !!

Спасибо.

UPDATE

По запросу, вот XML, и как указано ниже 1000 раз;)

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

Ответы [ 4 ]

1 голос
/ 28 апреля 2010

Человек, вам определенно нужно прочитать старую статью одного из основателей SO, Джоэла Спольски Вернуться к основам
Это очень хорошо объясняет вещи

1 голос
/ 28 апреля 2010

Чувак. Deffo использовать базу данных.

Если у вас есть XML-код, содержащий более 10000 строк, то зацикливание, конечно, займет много времени, и если операторы / else могут быть дорогими на этом уровне.

Базы данных предназначены для такого запроса и для получения информации потребуется доля секунды.

Кроме того, если сделать это умноженным на количество пользователей, делающих это - если они все используют функцию сканирования XML, ваш сервер будет кричать до наступления ночи.

1 голос
/ 28 апреля 2010

Могу поспорить, что многие ваши проблемы со скоростью связаны с тем, что вы выполняете итерацию и получаете несколько членов для каждой записи, каждый раз, когда поиск обновляется.

Я не уверен, как настроен ваш XML-файл (возможно, вы захотите опубликовать фрагмент, просто чтобы нам не приходилось догадываться по коду), но загружаю его в память и PHP-массивы при загрузке страницы (или даже когда сервер запускается, если вы можете сохранить его в кеше), тогда захват может быть лучшим решением.

Вы также упоминаете, что используете AJAX. Любой шанс, что вы можете отправить все это клиенту и позволить скрипту на его конце обрабатывать поиски (аналогично поиску в JavaScript в документации Doxygen). Это снимет нагрузку с вашего сервера и может оказаться более простым решением (вы просто отправите сценарий и файл 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>" ;
            }
        }
    }
}
0 голосов
/ 28 апреля 2010

Я не уверен, в чем заключался вопрос, поэтому я отвечу на ваш комментарий о базе данных: если ваша цель состоит в том, чтобы найти что-то в этих 10 000+ строках данных, то да , база данных будет легко быть в сто или тысячу раз более производительным, чем ваше текущее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...