2012-02-18 154 views
2

我正在使用jQuery和JSON製作聊天腳本,但由於'資源使用限制',我的主機暫停了它。我想知道是否有可能(以及如何)減少這些請求。我讀了一個關於Ajax超時的問題,但我對Ajax並不擅長。的代碼是:減少Ajax請求

function getOnJSON() { 
    var from; 
    var to; 
    var msg_id; 
    var msg_txt; 
    var new_chat_string; 

    //Getting the data from the JSON file 
    $.getJSON("/ajax/end.emu.php", function(data) { 
     $.each(data.notif, function(i, data) { 
      from = data.from; 
      to = data.to; 
      msg_id = data.id; 
      msg_txt = data.text; 
      if ($("#chat_" + from + "").length === 0) { 
       $("#boxes").append('...some stuf...'); 
       $('#' + from + '_form').submit(function(){ 
        contactForm = $(this); 
        valor = $(this + 'input:text').val(); 
        destinatary = $(this + 'input[type=hidden]').val(); 
        reponse_id = destinatary + "_input"; 
        if (!$(this + 'input:text').val()) { 
         return false; 
        } 
        else { 
         $.ajax({ 
          url: "/ajax/end.emu.php?ajax=true", 
          type: contactForm.attr('method'), 
          data: contactForm.serialize(), 
          success: function(data){ 
           responsed = $.trim(data); 
           if (responsed != "success") { 
            alert("An error occured while posting your message"); 
           } 
           else { 
            $('#' + reponse_id).val(""); 
           } 
          } 
         }); 
         return false; 
        } 
       }); 

       $('#' + from + '_txt').jScrollPane({ 
        stickToBottom: true, 
        maintainPosition: true 

       }); 
       $('body').append('<embed src="http://cdn.live-pin.com/assets/pling.mp3" autostart="true" hidden="true" loop="false">'); 
      } 
      else { 
       var pane2api = $('#' + from + '_txt').data('jsp'); 
       var originalContent = pane2api.getContentPane().html(); 
       pane2api.getContentPane().append('<li id="' + msg_id + '_txt_msg" class="chat_txt_msg">' + msg_txt + '</li>'); 
       pane2api.reinitialise(); 
       pane2api.scrollToBottom(); 
       $('embed').remove(); 
       $('body').append('<embed src="http://cdn.live-pin.com/assets/pling.mp3" autostart="true" hidden="true" loop="false">'); 
      } 
     }); 
    }); 
} 

上限爲600  請求數/ 5  分鐘,我需要使它幾乎每個第二。我有一年已經支付,他們沒有退款,也無法修改服務器,只能訪問cPanel

+0

什麼是「資源使用限制」到底是什麼?總共請求太多?數據太多?請求頻率太高?如果請求太多,那麼可能要查看Web套接字? – 2012-02-18 23:16:54

+0

@PaulGrime總共限制600次請求,每次5分鐘,試圖每秒獲得1次請求幾乎是實時的。我聽說有關AJAX的一些超時,但不明白,:S – Luis 2012-02-19 17:48:07

+3

我強烈建議更改提供程序。這是一個**非常**限制性的恢復 – HerrSerker 2012-02-27 13:25:04

回答

11

那麼,600   req/5  如果你想爲每個用戶提出一個請求/秒,那麼min是非常嚴格的。從本質上講,這給了你每個用戶將需要60  請求/分鐘。或300/5  分鐘。換句話說,即使你優化你的腳本兩個請求合併爲一個,最大您可以在您的網站有兩個用戶;)沒有太多的我猜...

你有兩個選擇:

  1. 堅持通過Ajax請求製作聊天系統並更改託管提供商。如果你不具備2的技能,這實際上可能更便宜。

  2. 忘記製作一個Ajax請求輪詢和潛在的另一個推動每一秒。實施一些圍繞網絡套接字,長輪詢或甚至XMPP。 如果你走這條路線,我會看socket.io一個透明的庫,它使用web套接字,它們被支持,並且具有後備到長輪詢和其他的輪詢。對於XMPP方式,出色的Strophe.js。請注意,這兩個路由比Ajax請求複雜得多,並且需要大量的服務器邏輯更改。

+0

謝謝,我看到了,但它不僅使聊天請求,並在幾個星期前,我看到在互聯網上的東西,你可以提出一個請求,每10分鐘 – Luis 2012-02-26 23:55:14

+0

並保持超時,所以如果服務器得到一個新的消息,它會返回,如果沒有,它會進行一個新的調用,我很快就看到它,所以我不知道如何 – Luis 2012-02-26 23:56:50

+0

抱歉張貼太多的評論,即時消息來自黑莓。沒有其他方法嗎?另外我不知道這是600/5,但對於每個訪問者,由於DDoS和這些東西。 – Luis 2012-02-26 23:58:08

2

ggozad的反應很好,我也推薦web套接字。他們只使用較新的瀏覽器模型,所以如果你想在所有的瀏覽器上使用它,你需要一個小的閃存橋接器(Flash可以非常容易地與套接字進行通信,也可以調用JavaScript函數並從JavaScript中調用)。另外,如果您有興趣,Flash會提供P2P。 http://labs.adobe.com/technologies/cirrus/

另外,對於服務器端你可以看看Node.js如果你是一個JavaScript的風扇和我一樣:)

要完成我的迴應:有沒有辦法讓巫基於Ajax的聊天,你被限制600  個請求/ 5個 分鐘(2個 個請求/秒),想要發送一個請求/秒並且想要兩個以上的用戶。

解決方案:切換到套接字或P2P。

2

我建議你使用單線程(作爲API代理)從服務器端調用付費服務。您仍然可以在此線程中輪詢600  請求/ 5  分鐘。然後,每個客戶端都會執行Ajax請求,以無限制地輪詢或長時間輪詢您的服務器API代理。

2

我不認爲檢查每一秒真的是一個好主意,在我看來對於網上聊天2/3秒檢查應該是遠遠不夠的。

爲了減少請求,您還可以在客戶端添加用戶活動檢查,如果窗口處於非活動狀態,您可以延長檢查時間,當用戶返回活動狀態時返回2/3秒,將允許您節省資源和請求/分鐘

2

我正在開發一個項目,需要保持UI與服務器事件同步。我一直在使用長輪詢,這確實會減少ajax調用的數量,但是這會讓服務器負擔監聽客戶端感興趣的事件,這也是無趣的。

我即將切換到我將設置爲獨立推送服務的socket.io。

現有的服務器 - >推到sockt.io服務器 - >推到訂閱客戶