2015-11-05 32 views
2

我想了解websockets。。它真的比Ajax更好?

我看過2個例子here in dochere

這兩個示例都使用無限循環循環,監聽新客戶端何時連接,何時執行某些有趣的事情以及何時斷開連接。

我的問題是:使用websockets(無限循環循環)比ajax解決方案更好,每次x請求http請求?

回答

3

是的,在很多情況下套接字更好。

這不是forever loop with 100% cpu utilizing,它只是liveloop,它存在於每個守護進程應用程序中。

同步accept操作是我們99.99%的時間。

Ajax心跳是更多的流量,更多的服務器CPU和內存。

4

AJAX和WebSockets有很大的不同。詢問一個人是否比另一個人好,就像問一個螺絲刀是否比錘子好。

WebSockets用於實時交互式通信。 WebSocket連接的兩端都可以發送數據,並且在另一端會在幾毫秒內收到。連接保持打開狀態,減少連接協商造成的等待時間。

但是,它只能很好地與HTTP播放。也就是說,它可以很好地與WebSocket感知的代理以及防火牆配合使用。 WebSocket流量絕對不是HTTP流量,除了客戶端的第一個數據包,它要求從HTTP切換到WebSocket協議。

另一方面,AJAX是純粹的HTTP。 AJAX和標準網絡請求之間的唯一區別是AJAX請求由客戶端腳本發起,並且響應可用於同一腳本而不是重新加載頁面。

在AJAX和WebSockets中,客戶端腳本都可以接收數據並在同一腳本中使用它。這就是相似之處的結局。

WebSockets建立了永久連接,雙方可以隨時發送數據,或者隨時安靜地坐下。使用AJAX,客戶端發出請求並且服務器響應。例如,如果要建立新的消息通知系統,如果您使用的是WebSockets,那麼只要有新消息可用,服務器就會直接將其發送到瀏覽器。如果沒有新消息,則服務器保持安靜。如果您使用的是AJAX,則客戶端會定期向服務器發送請求,服務器會始終響應,或者說沒有新消息,或者正在傳遞待處理的通知。服務器沒有辦法在它的最後發起事情,它必須等待AJAX​​請求。

服務器端的東西與傳統的PHP web開發範例不同。一個典型的WebSocket服務器將是一個獨立的CLI應用程序,作爲守護進程運行。 (如果最後一句話沒有意義,請花一點時間花時間真正理解如何管理服務器。)

這意味着多個客戶端將連接到相同的腳本,像$_GET$_SESSION這樣的超全局變量將毫無意義。在一個小的用例中構思起來似乎很容易,但請記住,您最有可能想從網站的其他部分獲取信息,這通常意味着使用完全不存在訪問HTTP請求/數據之外的數據的概念的庫和框架。響應模型。因此,爲了簡單起見,您通常會想要堅持使用AJAX請求和定期輪詢,除非您有辦法重新考慮網絡數據,並可能重新實現庫自動化的事情,如果您希望更新標準網絡流量。

至於服務器的循環:

它不是一個繁忙的循環,它是一個IO阻塞循環。

如果服務器嘗試讀取網絡數據,而且沒有可用的操作系統,則操作系統將阻止(暫停)該腳本並開始執行任何其他需要完成的操作。在我的WS服務器中,我阻止等待網絡流量一次至多1秒,然後腳本返回檢查並查看是否有其他新事發生,我應該通知我的客戶端。通常情況下,在服務器恢復到IO阻塞狀態之前的幾毫秒內,等待網絡上的新數據。一些其他人已經使用LibEv實現了我的服務器,它允許它們響應網絡IO之外的事件,而無需等待該塊超時。

這是幾乎每個服務器都能做的事情。這就是爲什麼您可以讓Apache主動監聽並提供網絡流量,而不需要每個運行Apache的服務器都以100%CPU使用率掛起,即使沒有流量。

最後,WebSockets是一項非常棒的技術,但Web庫和框架根本無法使用它們。因此,除非你在一個完整的AJAX請求等待3秒的系統中工作太久,否則最好使用AJAX。如果您正在編寫多人互動遊戲或聊天系統,那麼您已經找到了WebSockets的完美使用。

我真的很鼓勵大家學習WebSockets ......但它不是一個神奇的子彈,網絡中的少數部分是以人們可以真正使用它的方式設計的。

0

我也在學習階段。我已經構建了一個基於php的websocket服務器,並與網頁進行通信。也許我的2c觀點很有用。

讓websocket服務器(wss)使用可用的源代碼作爲起點並不難,但接下來要做的是如何處理它。

wss在CLI的CLI版本中運行。晚期模型瀏覽器加載一個包含對wss的請求的普通http或https頁面,以及該頁面需要做的其他事情,就會發生握手。然後,可以直接在瀏覽器和wss之間進行通信,任意一端都可以。這是低開銷,因此快速和簡單。很酷。關於該鏈接的說法需要通過兩端來理解 - 子協議。您可能必須在PHP和JavaScript中推出自己的產品。沒有更多的http頭,網址等等

wss是一個長期的,有狀態的php實例(非常不像apache等,它在發送頁面時忘記你)。整個應用程序可以在wss實例中運行,爲自己和每個連接的客戶端保持狀態。它曾經被認爲是PHP的長期生活太漏洞,但我再也聽不到了。但我相信你還是要小心記憶。

但是,作爲一個單獨的php實例,客戶端實例之間通常沒有分離。例如,類中的靜態信息與每個類實例共享,因此也是每個客戶端共享的。所以對於單個用戶風格的應用程序與一堆客戶共享數據,這非常棒。我可以看到,Ajax類型調用可以用這種方式替換,但是如果應用程序仍然需要重建狀態來爲每個客戶端提供服務,然後釋放它以節省資源,這似乎減少了優勢。

更進一步,爲客戶保留真正的有狀態實例似乎是下一步的可能。複製傳統的基於會話的系統是一種可能性,可選擇fork新的php解釋器並通過套接字或類似方式來管理父母和孩子之間的通信。但是,這將需要每個客戶端的資源,這將嚴重限制任何非平凡的應用程序。

或者也許可以將大部分應用程序放在父項中,讓孩子只做特定客戶端的東西。或者將應用程序設計分成可以通過套接字直接通信的小型獨立單元。套接字通信似乎正在趕上時下。

正如Ghedpunk所說的那樣,現實世界似乎還沒有準備好實現Web套接字概念的全部潛力,但它當然可以取代Ajax。服務器發送的附加優勢沒有被問到,開闢了以前難以考慮的新的可能性。