2012-01-09 64 views
2

我正在編寫一個簡單的應用程序,它在使用方面與聊天應用程序非常相似。主持人開始一個「房間」,參與者可以加入併發送消息到所述房間。EventSource vs polled ajax的效率/開銷?

我想盡可能簡化代碼。 PHP在後臺沒有任何花哨。

我的第一個想法是隻從客戶端進行輪詢ajax,以查看是否在該會議室中發佈了新消息。然後我認爲這會導致對服務器的瘋狂的請求(認爲它們很小,但仍然)。

然後,我研究了更多的HTML5方法,並發現了EventSource - 這在理論上看起來是正確的,但我不知道它在它的覆蓋下,它只是輪詢ajax。

然後有彗星,但它也需要一個服務器端組件,我不太急於設置。

我想我可以使用長輪詢 - 這是最好的辦法嗎?

此外,如何最小化所有客戶端請求新數據的數據庫請求?

回答

4

我認爲短輪詢是最簡單的代碼,但它可能會在服務器上創建不必要的負載。

長輪詢更高效,但您必須有一臺能夠高效支持多連接(即不是Apache)的服務器。

是的,EventSource只是一個美化的長輪詢,但與它合作愉快。

回答第二個問題:減少數據庫請求數的最佳方法是不要發出數據庫請求。例如,把東西放到memcached中。

+1

但是EventSource默認每3秒輪詢一次。我知道你可以改變那個時間,但我認爲長時間輪詢的想法是,你設置了一個請求,它只是等待,直到有數據 - 你如何用eventsource做到這一點? – 2012-01-09 05:15:36

+8

不,EventSource每3秒嘗試*重新連接*。如果你沒有關閉連接,它會馬上得到更新。 – 2012-01-09 05:19:13

+0

你的意思是不斷變得可用?是否有任何缺點不關閉該連接? – 2012-01-09 05:23:37

1

Sergio爲EventSource問題提供了一個很好的答案。他還表示,Apache不會擴展以處理許多同時/併發連接。 Apache上的PHP有這個問題 - 特別是如果你使用共享主機。

PHP的最佳解決方案是外包實時Web通信和消息分發。您可以通過使用self hosted realtime web solution自己做...

然後是彗星,但它也需要一個服務器端組件,我不是太急於成立。

但它聽起來像你不想熱衷於設置。所以,你最好的選擇是託管的實時網絡解決方案,如Pusher(我工作的人)使用WebSockets。

  • 當用戶加入他們訂閱chat-channel房間:通過使用這樣的服務,您可以按如下方式實現你的聊天應用。該名稱可以特定於交談的主題,例如chat-fishing(通道上here更多信息)
  • 當用戶提交聊天消息服務器將收到該消息(可能通過Ajax請求)
  • 你會用這個新信息更新數據庫
  • 一旦DB有成功更新後,您可以通過在chat-channel頻道上觸發new_message事件,將該消息分發(廣播)給同一聊天室中的每個用戶。這是通過託管服務RESTful API使用PHP library(它包裝了RESTful API所需的身份驗證等任何功能)完成的。
  • 消息被連接的客戶端收到。

tech example in this presentation應該證明我們採用消息分發的好處。

有一個關於how to build a chat application using PHP with Pusher on Nettuts+的好教程。

儘管此解決方案/答案非常以推送者爲中心,但概念(外包優惠,訂閱,渠道和事件)適用於支持實時客戶端推送的所有realtime hosted services

+0

有趣的解決方案。我期待這樣做是免費的,至少在不久的將來 - 或者說不超過我現在支付的東西,我不認爲DH會做任何形式的實時託管...很高興知道這個東西雖然 - 謝謝! – 2012-01-12 22:32:22