我有一個簡單的Web應用程序,它列出了一組私人用戶和他們發佈的最後一條消息。使用PHP/JS/MySQL進行輪詢的簡單/高效方法
我目前只是通過使用Ajax輪詢每30秒打一個php腳本,它將獲取所有人和最新消息,然後返回爲JSON。我解析並更新DOM。
大部分時間都不是很有效率,沒有任何變化,但它仍然每30秒獲取所有數據。
有沒有什麼基本的我可以做的,只是用代碼來改善呢?
我應該使用類似pusher.com的東西嗎?
有很多關於實現長輪詢的教程,但我希望儘可能簡單。
我有一個簡單的Web應用程序,它列出了一組私人用戶和他們發佈的最後一條消息。使用PHP/JS/MySQL進行輪詢的簡單/高效方法
我目前只是通過使用Ajax輪詢每30秒打一個php腳本,它將獲取所有人和最新消息,然後返回爲JSON。我解析並更新DOM。
大部分時間都不是很有效率,沒有任何變化,但它仍然每30秒獲取所有數據。
有沒有什麼基本的我可以做的,只是用代碼來改善呢?
我應該使用類似pusher.com的東西嗎?
有很多關於實現長輪詢的教程,但我希望儘可能簡單。
當您使用請求HTTP以每30秒就可能多的資源會使用,如果有1000個用戶和更多的我認爲這是不好的Web服務器,
我建議使用Nodejs有,節點JS是JavaScript的服務器是基於Chrome的JavaScript運行時構建的平臺,可輕鬆快速構建,並支持長時間投擲和非塊請求。
與nodejs,你可以建立你的網絡服務器,可以處理許多用戶和實時應用程序。
有很多框架可以與節點JS
,如果你想嘗試被實施,這是簡單的教程.. http://martinsikora.com/nodejs-and-websocket-simple-chat-tutorial
無需改變大部分基礎設施,您可以返回簡單的消息確定是否有任何變化。
所以,如果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
屬性。如果updated
是true
在解析事件的宏觀方案中,但是每個HTTP請求引起的開銷。每次輪詢時,都會向瀏覽器發出新的請求。擁有大量併發用戶將開始引入性能問題。我建議看看實時web框架,如Node.js(如viyancs提到的),因爲它們爲每個用戶保持持續連接以允許「推送」數據(而不是輪詢),從而減少HTTP開銷。
謝謝,所以基本上在每次投票中,它將更新當前登錄用戶記錄上的'last_polled'日期時間字段,然後如果自那時起東西已更改,它將更新:true。所以這是一個額外的MySQL查詢,但會減少帶寬。我遵循正確嗎? – Quad6
是的,就是這個想法。這樣,只有在更新時纔會通過JSON發送而不是每一次都會節省帶寬。 –
在這種情況下,更好的解決方案是使用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);
當調查,而不是在返回相同的數據,並且每隔30秒,如果什麼也沒有改變過,你能不能有一個特殊的返回代碼告訴Javascript不要改變網頁? – phillid
@phillid有正確的想法。更好的做法是僅僅利用http協議的+ web瀏覽器對緩存和條件http請求的出色支持。 – goat
@rambo編碼器,謝謝我喜歡那個聲音。你能指點我的例子或更多信息的方向嗎? – Quad6