2009-07-12 7 views
1

Wenn ich eine asynchrone Anfrage mit jQuery Ajax ausführen, manchmal die Antwort schnell in 800 ms zurückgegeben wird, manchmal ist es langsam und die Antwort wird in 2.50s (avg) zurückgegeben, und manchmal hängt es und zeigt nur die Ladebilder. Ich bin nicht sicher, ob es wegen meines PHP-Codes oder jQuery Ajax-Codes ist. Ich schicke einige Werte jQuery Ajax:Variable Geschwindigkeit der Antwort mit jQuery Ajax Anfragen

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(); 
      }); 
     } 
    }); 
} 

und in der PHP-Datei Ich habe den folgenden Code, um die angeforderten Daten abzurufen:

//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>'; 
} 

Ich frage mich, wenn Sie irgendwelche Fehler in meinem Code finden können, die Verzögerung verursachen; zusätzlich verwende ich ein PEAR DB-Objekt, um mit der Datenbank zu interagieren.

Wenn ich den Titel meiner Frage auf dieser Seite eintippe, werden Vorschläge in etwa 500 ms zurückgegeben. Warum ist diese Ajax-Interaktion so schnell, aber meine ist es nicht?

Antwort

0

Ich gehe davon aus, dass Sie die Reaktionszeiten (die 800ms - 2,5s, die Sie erwähnten) über FireBug erhalten? Wenn das der Fall ist, dann ist das die Zeit der Anfrage selbst. Zu diesem Zeitpunkt wurde Ihr gesamter Entwickler-Land JS bereits ausgeführt und der einzige JS, der gerade ausgeführt wird, ist der jQuery-Code in der ajax()-Funktion.

Also ich denke, Sie können einigermaßen sicher sein, dass es Ihr PHP-Code ist.

Was ich tun würde, ist einige php microtime() Aufrufe verwenden und schlagen Sie das Skript direkt (von einem Browser oder Kommandozeile, nicht über einen Ajax-Aufruf) und drucken Sie das Mikro-Ergebnis.

Insbesondere würden Sie dies am Anfang des Skripts hinzu:

$start = microtime(true); 

Und am Ende:

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

Dann versuchen zu isolieren, was params/etc verwendet werden, während alle konsistent langsamen Abfragen. Wie in den meisten Fällen bei CRUD-Apps ist die DB meistens der Schuldige.

Edit:

Nach genauer an Ihrem Code suchen, gibt es nichts, offensichtlich falsch. Was ich mich wundere ist, wenn dies die einzige Anfrage ist, die so verrückte Antwortzeiten hat. Wenn dies der Fall ist, deutet dies darauf hin, dass die Verbindung zwischen Ihrem Client und dem Server nicht das Problem ist. Das ist genau dieses Skript.

Und indem Sie tun, was ich oben erwähnt - das Skript direkt über Ihren Browser anstelle von einem Ajax-Aufruf schlagen - können Sie den PHP-Code isolieren und dann, durch Verschieben der Platzierung dieser Mikrozeitinformationen, die spezifischen Linien von Code.

Aber wenn ich es wäre, würde ich mich zuerst auf diese SQL-Abfrage konzentrieren. Meistens verwenden Sie kein Bytecode-Caching wie APC. Es ist ein großartiges Tool, das gerade nicht so weit verbreitet ist.

Der einzige Cache-Mechanismus, den Code verwendet, ist wahrscheinlich der MySQL Query Cache. Wenn für das Subcatid-Feld kein Index vorhanden ist, führt MySQL möglicherweise einen Tabellenscan durch. Aber wenn Sie das nächste Mal dieselbe Abfrage (mit demselben Subcatid-Wert) anfordern, werden die Ergebnisse im Abfrage-Cache gespeichert und MySQL gibt sie sofort zurück.

Man könnte dies durch Isolierung testet noch weiter: Vergessen Sie den AJAX-Aufruf und der PHP-Code, einfach kopieren und diese Abfrage einfügen, in einigen gültigen subcatid Werten stecken, und es direkt in phpMyAdmin oder MySQL-CLI ausführen oder dein Lieblings-MySQL-Tool. Wenn Sie beim Einfügen neuer und verschiedener Subcatid-Werte eine unregelmäßige Leistung sehen, wissen Sie, wo Ihr Problem liegt.

+0

Ja, danke, ich werde an Ihrer Lösung arbeiten. gute Empfehlung;) ich seprate Ajax ruft PHP-Dateien und jetzt bekomme ich bessere Ergebnisse. – mehdi

0

Möglicherweise Caching sowohl im Browser und alle php Mem-Caching läuft.

0

Netzwerklatenz kann einen großen Einfluss auf Ihre Ajax-Anrufe haben, insbesondere wenn die eine oder andere Seite keine konsistente Internetverbindung hat. Da das Problem anscheinend nur sporadisch auftritt, würde ich vorschlagen, Netzwerk oder Caching als mögliche Quelle zu betrachten.

+0

Nein, Sie haben gerade die if() -Anweisung am Anfang des PHP-Snippets verpasst. Da ist kein Injektionsvektor. –

+0

Wahr, mein Schlechter. Ich nehme das raus. – acrosman