2012-11-05 92 views
2

我有一個簡單的Web應用程序,它列出了一組私人用戶和他們發佈的最後一條消息。使用PHP/JS/MySQL進行輪詢的簡單/高效方法

我目前只是通過使用Ajax輪詢每30秒打一個php腳本,它將獲取所有人和最新消息,然後返回爲JSON。我解析並更新DOM。

大部分時間都不是很有效率,沒有任何變化,但它仍然每30秒獲取所有數據。

  1. 有沒有什麼基本的我可以做的,只是用代碼來改善呢?

  2. 我應該使用類似pusher.com的東西嗎?

有很多關於實現長輪詢的教程,但我希望儘可能簡單。

+0

當調查,而不是在返回相同的數據,並且每隔30秒,如果什麼也沒有改變過,你能不能有一個特殊的返回代碼告訴Javascript不要改變網頁? – phillid

+0

@phillid有正確的想法。更好的做法是僅僅利用http協議的+ web瀏覽器對緩存和條件http請求的出色支持。 – goat

+0

@rambo編碼器,謝謝我喜歡那個聲音。你能指點我的例子或更多信息的方向嗎? – Quad6

回答

2

當您使用請求HTTP以每30秒就可能多的資源會使用,如果有1000個用戶和更多的我認爲這是不好的Web服務器,

我建議使用Nodejs有,節點JS是JavaScript的服務器是基於Chrome的JavaScript運行時構建的平臺,可輕鬆快速構建,並支持長時間投擲和非塊請求。

與nodejs,你可以建立你的網絡服務器,可以處理許多用戶和實時應用程序。

有很多框架可以與節點JS

  1. socket.io
  2. express

,如果你想嘗試被實施,這是簡單的教程.. http://martinsikora.com/nodejs-and-websocket-simple-chat-tutorial

0

無需改變大部分基礎設施,您可以返回簡單的消息確定是否有任何變化。

所以,如果http://localhost/example/request正在恢復:

{ 
    "phoneNumbers": [ 
     { 
      "type": "home", 
      "number": "212 555-1234" 
     }, 
     { 
      "type": "fax", 
      "number": "646 555-4567" 
     } 
    ] 
} 

對每個請求,可以改爲返回以下,如果沒有已更新:

{ 
    "updated": false 
} 

此外,你還可以有updated: true這表示它是已更新:

{ 
    "updated": true, 
    "phoneNumbers": [ 
     { 
      "type": "work", 
      "number": "111-222-3333" 
     } 
    ] 
} 

總體而言,您只需檢查每個查詢中返回對象的updated屬性。如果updatedtrue

在解析事件的宏觀方案中,但是每個HTTP請求引起的開銷。每次輪詢時,都會向瀏覽器發出新的請求。擁有大量併發用戶將開始引入性能問題。我建議看看實時web框架,如Node.js(如viyancs提到的),因爲它們爲每個用戶保持持續連接以允許「推送」數據(而不是輪詢),從而減少HTTP開銷。

+0

謝謝,所以基本上在每次投票中,它將更新當前登錄用戶記錄上的'last_polled'日期時間字段,然後如果自那時起東西已更改,它將更新:true。所以這是一個額外的MySQL查詢,但會減少帶寬。我遵循正確嗎? – Quad6

+0

是的,就是這個想法。這樣,只有在更新時纔會通過JSON發送而不是每一次都會節省帶寬。 –

0

在這種情況下,更好的解決方案是使用XHR長輪詢。它的作用有點類似於你現在正在做的事情,即通過發出AJAX請求。

下面是它如何工作的:

你讓AJAX請求爲您正確的現在。
服務器端腳本只有在有更新時纔會返回(回聲)。如果沒有一個,它會保持循環並等待更新。這將保持AJAX請求未決。
當有更新時,服務器端腳本返回,客戶端JS更新DOM,並立即發出新的AJAX請求。

PS - 爲此,您必須確保腳本在30秒後未設置爲超時。

在僞代碼,這是你的服務器端腳本將是什麼樣子

$newInfo = false; 

while ($newInfo === False) { 
    $newInfo = getNewInfo(); // a method that returns the new info. False if nothing has changed 
    // sleep here for a bit 
    usleep(500000); 
} 

// will only reach here when something has changed 
echo json_encode($newInfo); 
+0

如果一次有大量用戶在網站上運行(即打開頁面時可能有400多個用戶),這樣可以嗎?它不會最大限度地提供apache連接的數量嗎? (託管在mac os服務器上的apache上) – Quad6

+0

這可能不是最具可擴展性的選項。谷歌過去最初在瀏覽器中使用GChat,但我想他們在負載均衡器後面使用了一大羣功能強大的服務器。 – xbonez