Apache Server php / ajax sayesinde büyük bir xml dosyası sorgularken performans sorunu olduğunda

3 Cevap php

Ben web sitesi (yazarken görüntülenen sonuçlar) basit bir "canlı arama" var. Bu makyaj Ajax oldukça büyük bir XML belgesi (10.000 + hat) sorgulama PHP etmektir. Bu, tüm yerel bir Apache sunucu (XAMP) üzerinde barındırılan be. Xml belgenin ölçeği sonuçları sonuçları vermek için 10ish saniye alarak büyük bir performans sorunu neden gibi görünüyor.

Ben PHP için çok yeni değilim bu yüzden orada aşağıda durumunda bir kod parçacığı (bu aslında hakkında benim ilk oyun olma) belirgin bir şey var

    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>" ;
        }

      }
    }
  }
}

Ayrıca DB verilere sahip ve gerçekten .. o zaman ben buna açığım, hızlıdır Tüm fikirler erişen eğer!

Teşekkürler.

GÜNCELLEME

Talep olarak, burada XML, ve aşağıda kez 1000 belirtildiği gibi ;)

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

3 Cevap

Ahbap. Deffo veritabanını kullanır.

Eğer 10.000 + çizgili XML varsa, loop için elbette uzun bir zaman alacak, ve if / else ifadeleri bu düzeyde pahalı olabilir.

veritabanları, böyle bir sorgu için tasarlanmış ve bilgi almak için bir ikinci bir kısmını alacaktır.

Ayrıca, bunu yaparken kullanıcıların maount çarpılır bu yapıyor - hepsi XML tarama işlevini kullanırsanız, sizin sunucu sonbahar gece önce bir çığlık tekme olacak.

Ben senin hız problemleri bir sürü yineleme ve her girişin bazı üyeleri, her zaman arama güncellemeleri alıyoruz gerçeği ile ilgili olacak bahis değilim.

Ben (sadece bu yüzden biz kodundan tahmin etmek zorunda değilsiniz, bir pasajı gönderebilmek isteyebilirsiniz) XML dosyası nasıl kurulduğuna emin değilim, ama bellek ve PHP diziler içine yüklerken bile sayfa yüklendiğinde (veya önbelleğe tutmak eğer sunucu), başladığında daha iyi bir çözüm olabilir dan sonra kapma.

Ayrıca AJAX kullanarak konum söz. Eğer müşteriye hepsini göndermek ve onların ucunda bir betik (Doxygen belgelerinde javascript arama benzer) aramalarını işlemek için izin verebilecek herhangi bir şans. Bu sizin sunucusu kapalı yükü alır ve (sadece üzerinde dosya bir komut dosyası ve XML göndereceğiz) basit bir çözüm olabilir.

Edit: Ve kesinlikle hiçbiri mümkün ise, bu kod daha hızlı bir dokunuş olmalı:

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>" ;
            }
        }
    }
}

Ben soru ben bir veritabanı hakkında yorum adres olacak kadar ne emin değilim: Amacınız, verilerin bu 10.000 + hatları bir şey arama için ise daha sonra yes, bir veritabanı kolayca olacak yüz ya da bin kat daha fazla ölçülebilir geçerli bir çözüm daha.