2013-12-12 19 views
2

就像標題所說,我正在使用jQuery,ajax,mysql和php編寫即時消息傳遞程序。目前,我有一個包含字段jQuery setTimeout ajax遞歸函數在即時消息傳遞程序中短時間拋出錯誤

中旬*,從,到,信息,時間戳表「總機」數據庫,讀取

我有一個使用的setTimeout遞歸查詢每1〜3的功能新的未讀消息秒如下:

function get_new_messages(){ 
    if($('input[name="from"]:checked').val() 
     && $('input[name="to"]:checked').val() 
     && ready) { 

     ready=false; 
     //ajax call 
     $.ajax({ 
      url: 'chatAjax.php', 
      type: 'POST', 
      data: { 
       checker_from:$('input[name="from"]:checked').val(), 
       check_to: $('input[name="to"]:checked').val()}, 
       success: function(data){ 
        $('#chat_window').append(data); 
        ready=true; 

      setTimeout(get_new_messages,1000); 
       }, 
       error: function(){ 
        ready=true; 
      setTimeout(get_new_messages,3000); 
      }    
     } 
     ); 
    } else{ 
     setTimeout(get_new_messages,3000) 
    } 
} 

現在我只是測試,所以checker_from和check_to對應於包含用戶名單選按鈕。使用兩個瀏覽器窗口我試圖從一個窗口發送消息到另一個窗口,但是,一段時間後,控制檯顯示一致的POST故障。這是內存泄漏還是別的什麼。任何幫助將不勝感激

+0

什麼是發佈失敗? – Hellgorithm

+0

我看你是新來的stackoverflow,歡迎!然而,這不像一個論壇,在標題中看到「hi」有點奇怪,標題通常只是在chrome開發工具的網絡選項卡下的SO – Markasoftware

+0

上的標題,它只是表示(失敗)在狀態列,並在啓動器列下我得到jquery.js:8706,這是xhr.send((s.hasContent && s.data)|| null); – user3093574

回答

0

請考慮使用Node.js和Socket.IO。它效率更高。 My book會詳細介紹如何完成此操作,但網絡上有許多Node/Chat演示。你可以使用節點作爲聊天服務器,使用PHP作爲其他任何事情。

您看到POST錯誤的原因可能是由於您正在進行不斷的輪詢。瀏覽器通常對給定服務器的併發連接數量有限制。傳統上,一個域限制爲2個併發連接,儘管現在在某些瀏覽器中已經改變了(我在考慮Chrome)。我懷疑當POSTs開始互相「超越」並超出限制時,你會看到錯誤。此外,像這樣的輪詢會迅速殺死多用戶系統中的服務器。

不是經常輪詢,而是想要處理推送消息的東西,比如web套接字和長輪詢回退。 Socket.IO和Strophie庫提供了這個功能。我有Strophie/XMPP的經驗 - 我可以證實它很複雜。 Socket.IO可輕鬆擴展到每臺服務器數千(或數萬)。您目前所追求的解決方案遠不及可擴展性:)

+0

謝謝,我會考慮這個。它肯定似乎是輪詢問題,因爲代碼運行良好一段時間,然後就是不,即使請求基本相同 – user3093574

+0

您所說的一切都是真實的,node和socket.io比OP的解決方案,但這看起來不像是一個答案,它看起來更像是一個無恥的插件來宣傳你的書,並且只是一個評論說「節點與socket.io更好」,本來是更好的IMO。 – adeneo

+0

@ adeneo首先,我認爲這是一個很好的,詳細的答案,基於大量的網絡消息傳遞經驗。其次,我在Stackoverflow上有數百條評論和帖子,這是我唯一一次鏈接到我的書。我這樣做只是因爲它非常相關 - 本書展示瞭如何建立一個接近生產級的聊天服務器。最後,「但是網絡上有很多Node/Chat演示」,說明網絡上有許多免費資源可以涵蓋相同的問題。如果對你的迴應仍然無恥,我很抱歉。 –