2015-05-08 44 views
1

我有一個主要由javascript/ajax驅動的Web應用程序,有點類似於谷歌文檔的工作方式;所有查看頁面的人都會以相對實時的方式查看相同的信息。信息實際上是實時的並不重要,一秒鐘左右就沒有問題。服務器發送PHP腳本是否必須輪詢?

目前,應用程序每5秒就會對服務器進行一次Ajax化。我正在研究服務器發送的事件,他們聽起來像我需要的......但這是我的理解:服務器發送的事件本質上只是將輪詢移動到服務器。執行服務器發送的事件的PHP腳本將每X秒檢查一次數據庫的更改,並在找到該更新時嚮應用程序發送更新。

每秒檢查一次可能是足夠的,但由於我在共享主機,我想避免任何不必要的負載。有沒有辦法可以訂閱數據庫的更新?或者有沒有一種方法可以讓其他PHP腳本通知腳本來修改數據庫?

回答

0

我會推薦的是,不是輪詢數據庫的更改,而是知道何時會發生數據庫更改,因爲您的應用程序將進行更改。我會使用網絡套接字(https://developer.mozilla.org/en-US/docs/WebSockets),並在任何成員進行更改時將更新推送到所有活動客戶端。

以下是服務器發送事件和Web套接字之間的區別。 (在你的情況下,Web套接字是要走的路)

Websockets和SSE(服務器發送事件)都能夠將數據推送到瀏覽器,但它們不是競爭技術。

Websockets連接既可以向瀏覽器發送數據,也可以從瀏覽器接收數據。一個可以使用websockets的應用程序的好例子是一個聊天應用程序。

SSE連接只能將數據推送到瀏覽器。在線股票報價或更新時間線或訂閱源的推文是可以從SSE中受益的應用的好例子。

在實踐中,因爲SSE所能做的一切都可以通過Websockets完成,所以Websockets得到了更多的關注和熱愛,許多瀏覽器支持Websockets而不是SSE。

但是,對於某些類型的應用程序來說這可能是矯枉過正的,後端可能更容易使用SSE等協議實現。

+0

那麼我想我會問,服務器發送事件的目的是什麼?他們只是一個噱頭? – Entity

+1

不,他們服務於兩個不同的功能。看到我更新的答案。 –

2

使用PHP,輪詢數據庫是執行此操作的典型方法。您還可以使用TCP/IP套接字連接到位於數據庫前的某種應用程序服務器,並且知道所有編寫者和所有使用者。即當寫入時,它會將它廣播給所有消費者並將其寫入數據庫。該示例中的消費者是PHP腳本(每個SSE客戶端一個)。

如果您使用WebSockets,那麼您需要完全相同的架構,因爲PHP是單線程的:每個SSE連接都是一個獨立的PHP進程。

如果您切換到使用node.js,那麼該應用程序服務器可以是內置的。 (同樣,無論是SSE還是WebSockets,它的工作方式都是一樣的。)

但是,你提到你打算使用共享主機。 SSE(以及WebSockets和彗星技術)持有一個開放的套接字,這會干擾共享主機的經濟性。所以你的套接字可能會定期關閉。我的建議是堅持使用ajax(因此DB)每5秒輪詢一次,而不是SSE,直到你的應用程序價值足夠,那麼真正的主機的$ 10- $ 100 /月不是問題。然後考慮使用SSE來優化延遲。

P.S. SSE和WebSockets之間的決定都是關於寫頻的。我的指導方針是,如果您的客戶編寫數據平均一秒鐘或更頻繁一次,則網絡套接字更好,因爲它會保持寫入通道的開啓。如果每5秒鐘一次,那麼web套接字不會帶來太多,相比之下,每次有數據寫入時,只需使用Ajax帖子。 SSE後端比WebSockets後端更容易處理。 (每1-5秒寫入灰色區域。)

相關問題