2010-10-01 243 views
14

我正在構建一個需要相對不變的數據庫輪詢的網頁組件。我可以看到兩種不同的方法,我想知道他們中的一個是否比其他人好,或者如果我錯過了第三個選擇。AJAX輪詢頻率 - 要長期輪詢還是不輪詢長輪詢?

1)發送關斷一個AJAX請求每1或2秒,以檢查更新。無論是否有新數據,每個請求都會立即返回。
2)觸發一個AJAX請求,直到它接收到數據或發生超時纔會返回。發生這些事件時,它會觸發下一個請求。 (我想,這就是所謂的長輪詢?)

數據庫查詢的數量將與任一相同,但與2號會有更少的請求,從中可以節省帶寬和客戶資源的瀏覽器觸發。對於服務器來說,是否最好有一個PHP請求保持活動並在兩次查詢之間休眠,或者每隔幾秒鐘啓動一次,輪詢數據庫,然後關閉?或者沒有什麼區別,我對此太強調了?

編輯:我想我也應該指出,這是一個較大的Web應用程序的聊天工具。通信的輕微延遲不會殺死用戶,因爲聊天是次要功能。

+0

這實際上取決於長民意調查將會持續多久,以及您連接的客戶數量。如果你有2或3個,長時間輪詢可能會更好(因爲更新會是瞬間的)。如果你有很多,長期民意調查將是非常昂貴的,因爲每個連接都需要一個PHP過程(因爲它是讓PHP持續開放的PHP)。所以在這種情況下,我會使用「智能」輪詢間隔。基本上,如果平均更新時間爲10秒,則輪詢時間爲5,然後是8,然後是10,然後是11等)。基本上把時間減少一半。它在服務器上更容易(因爲平均負載下降),但速度很快... – ircmaxell 2010-10-01 18:40:13

+0

我想我還應該說,這是一個更大的Web應用程序的聊天部件。通信的輕微延遲不會殺死用戶,因爲聊天是次要功能。但我們希望它是合理的(2秒內?) – Derek 2010-10-01 18:43:31

+0

老實說,我不會在PHP中這樣做。獲取另一種語言,並實現一個隊列系統並使用持久的TCP連接來回傳輸......或者,爲什麼不簡單安裝Jabber並完成(並且可能實現一個JS接口到服務器)... – ircmaxell 2010-10-01 18:57:31

回答

8

長輪詢會比輪詢變得更好(即較少的服務器負載),同時給予更好響應時間。

如果您的收件人投票,消息的平均行程時間將一半的輪詢間隔。

隨着長輪詢,其瞬間 - 服務器只如果有什麼可說的等待。

如果您正在進行聊天消息,請進行長時間輪詢;它是一個可用性的東西。

向下側與長輪詢是更復雜實現;但它並不那麼複雜,並且被廣泛實施。所以,如果你不能使用你選擇的web服務器的現成框架,你可以着手寫一個合理的,你會得到它的工作。

+1

的一致意見。但是有十幾個客戶全部訪問系統,這是十幾個php進程在100%的時間內處於活動狀態。就可擴展性而言,我認爲這並不比每秒觸及一半的情況差得多。 – Derek 2010-10-01 19:25:15

+0

確保這些進程很好地睡着,而不是在他們自己的一些輪詢中,並且它們都很好,很平穩。擔心你有幾百個或更多的客戶。 – Will 2010-10-01 20:02:55

2

你也可以看看websockets,最新的瀏覽器的一部分(或模擬通過你把你的頁面上Flash file

+0

不幸的是,我需要能夠支持當前和可能的舊版瀏覽器。儘管肯定值得更多的研究。謝謝! – Derek 2010-10-01 18:45:18

+1

這就是閃存適配器 – Will 2010-10-01 18:55:38