2012-02-01 76 views
0

這很適用於檢索說明15通過的PHP數據,但是當json文件說100個項目時,它會扼殺php腳本並創建隨機錯誤。我的猜測是因爲這些請求都是由這個單獨的ajax請求(比php腳本更快)產生的,php腳本變得混亂了?Ajax Loop壓倒PHP腳本

$(document).ready(function(){ 

     var ajax_load = "<div class='loadwrap'><img class='load' src='/img/load.gif' style='width:12px;' alt='' /> fetching list...</div>"; 

     $("#status").html(ajax_load); 

     $.getJSON('/fsbo/get_urls_24_hours', function(data) { 

      $("#alias").fadeOut('slow'); 
      var ajax_load = "<div class='loadwrap'><img class='load' src='/img/load.gif' style='width:12px;' alt='' /> fetching property...</div>"; 

      $('#props').html('');  

       $.each(data, function(key, val) { 
        $.ajax({ 
         type: "POST", 
         url: base_url + "/fsbo/get_property", 
         data: "url="+ val, 
         cache:false, 
         success: 
         function(data){ 
         $("<div></div>").html(data).appendTo('#props'); 
         } 
        }); 

       }); 
     }); 
    }); 

作爲一個側面提示,我該在哪裏放置隱藏加載gif?把它放在循環的末尾並不好,它只是打開並關閉而不是等待數據的返回。

+0

對於加載gif:在啓動AJAX請求之前顯示它,將其隱藏在AJAX請求的回調函數中。 – 2012-02-01 20:01:19

+0

不起作用。它顯示然後隱藏。後來的項目追加。 – Robert 2012-02-02 21:02:06

回答

1

我認爲你有正確的答案,那是因爲這個電話。

PHP調用工作的方式是通過對系統創建一個單獨的調用,同時調用各種其他庫,因此調用一種內存泄漏,這會大大增加所需的時間和資源。

我的建議是 - 將所有變量傳遞給PHP並讓它完成工作,然後接收JSON對象並解析它。

它對最終用戶來說可能有點慢,但應該有助於避免發生這種情況。

P.S.

我有類似的問題,當這些類型的調用爲一個用戶提出這麼多的請求時,整個web服務器崩潰了。

3

在循環中發出AJAX請求通常是一個糟糕的主意。爲什麼不只是修改原始調用,以便在您的JSON中返回所需的所有數據,而不是撥打100個電話。

如果由於某種原因您無法避免這種情況,請限制未決請求的數量。例如,發送前5個請求,然後只有在您收到前5個響應後才發送第6個請求。這樣,只有5個請求在任何時候處於待處理狀態,並且您的服務器不會同時被100個全部命中。

2

此代碼被剪掉是殺手。

$.each(data, function(key, val) { 
     $.ajax({ 

如果data長度爲100將會有100個HTTP連接到服務器。這顯然會窒息你的服務器。此外,你的瀏覽器會變慢。它就像在Firefox中打開100個標籤一樣。

在單個Ajax請求中傳遞所有數據。如果大小很大,則按塊發送塊。當你收到第一個響應時,發送下一個塊的請求。但不要同時發送它們。