2009-07-12 46 views
1

當我使用jQuery Ajax執行異步請求時,有時響應會在800毫秒內快速返回,有時響應很慢,響應以2.50s(平均)返回,有時會掛起,並只顯示加載圖像。我不確定是因爲我的PHP代碼還是jQuery Ajax代碼。我送使用jQuery Ajax的一些值:jQuery Ajax請求的響應速度變化

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

,並在PHP文件,我有以下代碼檢索請求的數據:

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

我不知道,如果你能找到我的代碼中的任何錯誤,造成延誤;另外我使用PEAR DB對象與數據庫進行交互。

當我在這個頁面中鍵入我的問題的標題時,建議將在大約500毫秒內返回。爲什麼這個Ajax交互如此之快,但我的不是?

回答

0

我假設你通過FireBug獲得了響應時間(800ms - 你提到的2.5s)?如果是這樣的話,那就是請求本身的時間。在這一點上,所有的開發人員土地JS已經執行,唯一運行的JS是ajax()函數中的jQuery代碼。

所以我認爲你可以合理地確定它是你的PHP代碼。

我想要做的是使用一些php microtime()調用並直接命中該腳本(從瀏覽器或命令行,不通過ajax調用)並打印出microtime結果。在結束

$start = microtime(true); 

這:

具體來說,你會在你的腳本的頂部添加此

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

然後,嘗試隔離期間使用什麼PARAMS的/ etc任何一貫緩慢的查詢。與大多數情況下使用CRUD應用程序一樣,數據庫通常是罪魁禍首。

編輯:

你的代碼更加密切關注後,沒有什麼明顯的錯誤。我想知道的是,如果這是唯一有這樣瘋狂的響應時間的請求。如果是這樣,那表明您的客戶端和服務器之間的連接不是問題。這是特別的這個腳本。

通過做上面提到的 - 直接通過瀏覽器而不是ajax調用直接觸發腳本 - 您可以隔離PHP代碼,然後通過移動這些microtime語句的位置,隔離特定行碼。

但是,如果是我,我會首先關注該SQL查詢。最像你沒有像APC那樣使用任何字節碼緩存。這是一個很棒的工具,目前它還沒有被廣泛使用。

因此,代碼使用的唯一緩存機制可能是MySQL查詢緩存。如果subcatid字段上沒有索引,則可能是MySQL正在執行表掃描。但是,下一次您請求相同的查詢(使用相同的子標籤值)時,結果將位於查詢緩存中,MySQL將立即返回它們。

您可以通過隔離進一步測試這一點:忘記AJAX調用 PHP代碼,只需複製並粘貼該查詢,插入一些有效subcatid值,然後直接運行到phpMyAdmin界面,或者MySQL的CLI或你最喜歡的MySQL工具。如果您在插入新的和不同的子標籤值時看到間歇性表現,那麼您知道問題出在哪裏。

+0

是的,謝謝我會處理您的解決方案。偉大的建議;) 我分開ajax調用PHP文件,現在我得到更好的結果。 – mehdi 2009-07-12 16:41:28

0

可能在瀏覽器中緩存以及任何正在進行的php緩存。

0

網絡延遲可能會對您的ajax呼叫產生巨大影響,特別是如果一方或另一方沒有一致的互聯網連接。由於問題似乎是間歇性的,我建議將網絡或緩存視爲可能的來源。

+0

Nah,你剛剛錯過了該PHP代碼片段頂部的if()語句。那裏沒有注射劑。 – 2009-07-12 16:03:01