JQuery Ajax istekleri ile yanıt değişken hız

3 Cevap php

JQuery Ajax ile uyumsuz bir isteği gerçekleştirmek zaman, bazen tepki, 800 ms hızla döndürülür somtimes yavaş ve tepki 2.50s (avg) döndürülür, ve bazen kilitleniyor ve sadece yükleme görüntüleri gösterir. Çünkü benim PHP kodu veya jQuery Ajax kodunun bu kadar emin değilim. JQuery Ajax kullanarak bazı değerleri göndermek:

function get_detail_product(obj)
{   	
    var id = obj.id ; 
    var $this = jQuery('#'+id); 
    var Thumb = jQuery('#Scroller div.Container') ;
    jQuery.each(Thumb , function(){
        jQuery(this).css('border' , '#ccc 2px solid');
    });
    $this.parent().css('border' , '#ff8500 2px solid') ;
    var load_area = jQuery('.detail') ;
    //ajax request 
    load_area.html("");
    load_area.html('<div id="loading" style="margin-top:60px;margin-left:350px;"><img src="../images/loading.gif"><br>Loding ... </div>');
    jQuery.ajax({
        url: 'index.php?module=product&popup=on ',
        type: 'POST',
        data: 'pid=' + id , 		
        success: function(result) {
            jQuery('#response').remove();
            load_area.html(result);
            jQuery('#loading').fadeOut(500, function() {
                jQuery(this).remove();
            });
        }
    });
}

ve PHP dosyası ben istenen verileri almak için aşağıdaki kodu var:

//ajax requests 
if(isset($_POST['subcatid']) && is_numeric($_POST['subcatid']))
{
    $subcatid = $_POST['subcatid'] ;
    $products = $dbc->getAll("select * from xxproduct where xsubcatid='$subcatid'") ;
    //send result 
    echo '<table cellpadding="0" cellspacing="0" border="0" id="ScrollerTable"><tr>'; 
    foreach ($products as $p) : echo '<td><div style="border:#ccc 2px solid ; padding:0px;margin-top:20px ; margin-bottom:20px ; margin-left:8px ; margin-right:8px;" class="Container"><a href="javascript:void(0)" id="'.$p['xproductid'].'" onclick="get_detail_product(this)" ><img src="imgsize.phpw=100&h=100&img=../uploads/product/'.$p['xproductid'].'/'.$p['xproductid'].'__1.jpg" border="0"/></a><div style="background-color:#ccc ;text-align:center ; padding:5px; ">'.$p['xproductname'].'</div></div></td>';
    endforeach ;
    echo ' </tr></table>'; 
}

Eğer gecikmeye neden benim kodda herhangi bir hata bulabilirsiniz acaba; ayrıca ben veritabanı ile etkileşim için bir PEAR DB nesnesi kullanıyorum.

Ben bu sayfada benim soru başlığını yazdığınızda, öneri yaklaşık 500 ms döndürülür. Neden bu ajax etkileşimin çok hızlı ama benim değil mi?

3 Cevap

Kundakçı via - Sana yanıt süreleri (2.5s Bahsettiğiniz 800ms) alıyoruz varsayarak yaşıyorum? Bu durum buysa, o zaman isteği kendisi zamanı. Bu noktada, geliştirici-kara JS hepsi zaten idam ve çalışıyor sadece JS ajax() fonksiyonu jQuery kodudur.

Yani bu sizin PHP kod makul emin olabilir düşünüyorum.

Ne yapardın bazı php microtime() çağrıları kullanın ve (bir ajax çağrısı ile, bir tarayıcı veya komut değil) doğrudan bu senaryoyu vurdu ve microtime sonucunu yazdırmak olduğunu.

Özellikle, size komut üstündeki bu eklemek istiyorum:

$start = microtime(true);

Ve sonunda bu:

echo "Time: " . (microtime(true) - $start);

Sonra, params / etc herhangi sürekli yavaş sorguları sırasında kullanılan ne izole etmeye çalışın. CRUD uygulamalar ile çoğu durumda olduğu gibi, DB en sık suçlu.

Edit:

Kodunuzu daha yakından baktıktan sonra, tabii ki yanlış bir şey yok. Bu tür çılgın yanıt sürelerine sahiptir tek isteği ise ne ben merak ediyorum. Eğer öyleyse, bu sizin istemci ve sunucu arasındaki bağlantı sorunu olmadığını göstermektedir. Özellikle bu senaryo bu.

Ve yukarıda bahsettiğim ne yaparak - tarayıcınıza ziyade ajax çağrısı ile doğrudan komut isabet - Eğer PHP kodu izole ve daha sonra, bu microtime tabloların yerleştirme hareket ettirerek, kod belirli satırları ayırabilirsiniz.

Bana olsaydı ama, ben bu SQL sorgusu ilk odaklanmak istiyorum. Çoğu APC gibi herhangi bir kod önbelleğe alma kullanarak değil gibi. Bu şu anda böyle yaygın kullanımda sadece değil harika bir araçtır.

Yani kodu kullanarak sadece önbelleğe alma mekanizması muhtemelen MySQL Query Cache olduğunu. Hiçbir dizin subcatid alanında varsa, bu MySQL bir tablo taraması yapıyor olabilir. Ama (aynı subcatid değeri ile) aynı sorguyu talep dahaki sefere, sonuçlar sorgu önbellek olacak ve MySQL anında onlara dönecektir.

Hatta daha da tecrit bu test olabilir: AJAX arama and PHP kodu, sadece kopyalamak ve bu sorguyu yapıştırın, bazı geçerli subcatid değerleri takın ve phpMyAdmin veya MySQL CLI doğrudan çalıştırabilirsiniz ya da unutun En sevdiğiniz MySQL aracı. Eğer plug-in gibi yeni ve farklı subcatid değerlerin aralıklı performans görüyorsanız eğer sorun burada yatıyor, sonra biliyorsun.

Muhtemelen tarayıcıda hem önbelleğe alma ve herhangi bir php mem-önbelleğe oluyor.

Bir tarafı ya da diğer bir tutarlı internet bağlantısı yoksa, özellikle ağ gecikme, ajax çağrıları üzerinde büyük bir etkisi olabilir. Sorun aralıklı gibi görünüyor beri olası kaynağı olarak ağ veya cacheing bakarak öneririm.