php - polling是什麼 - websocket stream




什麼是長輪詢,Websockets,服務器發送的事件(SSE)和Comet? (2)

我嘗試閱讀一些文章,但我對這些概念還不是很清楚。

會有人喜歡向我解釋這些技術是什麼:

  1. 長輪詢
  2. 服務器發送的事件
  3. 的WebSockets
  4. 彗星

我每次遇到的一件事情是,服務器保持連接打開並將數據推送到客戶端。 連接如何保持開放,客戶如何獲得推送的數據? (客戶如何使用這些數據,也許有些代碼可能有幫助?)

現在,他們中的哪一個應該用於實時應用。 我一直聽到很多關於websockets(使用socket.io [一個node.js庫]),但為什麼不是PHP?


Tieme在他的優秀答案中付出了很多努力,但我認為OPs的核心問題是這些技術如何與PHP相關聯,而不是每種技術如何工作。

除了明顯的客戶端html,css和javascript之外,PHP是web開發中使用最多的語言。 然而,當涉及實時應用程序時,PHP有兩個主要問題:

1)PHP開始是一個非常基本的CGI。 自從它處於早期階段以來,PHP已經取得了很大的進展,但它發生的步驟很小。 當它成為今天嵌入式和靈活的C庫時,PHP已經擁有數百萬用戶,其中大部分用戶都依賴於早期的執行模型,所以它還沒有做出可靠的嘗試來逃避內部的CGI模型。 即使命令行界面也調用PHP庫(Linux上的libphp5.so,Windows上的php5ts.dll等),就好像它仍然是一個處理GET / POST請求的CGI。 它仍然執行代碼,就好像它只需構建一個“頁面”,然後結束它的生命週期。 因此,它幾乎不支持多線程或事件驅動的編程(在PHP用戶空間內),使其對於實時,多用戶應用程序當前不切實際。

請注意,PHP的擴展可以在PHP用戶空間中提供事件循環(比如libevent)和線程(比如pthread),但是很少有應用程序使用這些擴展。

2)PHP在垃圾收集方面仍然存在重大問題。 雖然這些問題一直在改進(可能是如上所述結束生命週期的最大步驟),但即使是創建長時間運行的PHP應用程序的最佳嘗試也需要定期重新啟動。 這也使其對於實時應用程序不切實際。

PHP 7將是解決這些問題的一個很好的步驟,並且作為實時應用程序的平台看起來很有前景。


在下面的例子中,客戶端是瀏覽器,服務器是託管網站的網絡服務器。

在你理解這些技術之前,你必須首先理解傳統的 HTTP網絡流量。

常規HTTP:

  1. 客戶端從服務器請求網頁。
  2. 服務器計算響應
  3. 服務器將響應發送給客戶端。

Ajax輪詢:

  1. 客戶端使用常規HTTP從服務器請求網頁(請參閱上面的HTTP)。
  2. 客戶端接收請求的網頁,並在定期(例如0.5秒)從服務器請求文件的頁面上執行JavaScript。
  3. 服務器計算每個響應並將其發回,就像正常的HTTP流量一樣。

Ajax長輪詢:

  1. 客戶端使用常規HTTP從服務器請求網頁(請參閱上面的HTTP)。
  2. 客戶端接收請求的網頁並在從服務器請求文件的頁面上執行JavaScript。
  3. 服務器不會立即響應請求的信息,而是等待有新的信息可用。
  4. 當有新的信息可用時,服務器回應新的信息。
  5. 客戶端收到新信息並立即向服務器發送另一個請求,重新啟動該進程。

HTML5服務器發送事件(SSE)/事件源:

  1. 客戶端使用常規HTTP從服務器請求網頁(請參閱上面的HTTP)。
  2. 客戶端接收請求的網頁並在打開到服務器的連接的頁面上執行JavaScript。
  3. 當有新的信息可用時,服務器向客戶端發送一個事件。

    • 從服務器到客戶端的實時流量,大多數是您需要的
    • 您需要使用具有事件循環的服務器
    • 無法與其他域的服務器連接
    • 如果你想閱讀更多,我發現這些非常有用:( (article)(article)(article)(tutorial)

HTML5 Websockets:

  1. 客戶端使用普通的http請求服務器的網頁(請參閱上面的HTTP)。
  2. 客戶端收到請求的網頁,並在打開與服務器的連接的頁面上執行JavaScript。
  3. 當新數據(兩側)可用時,服務器和客戶端現在可以互相發送消息。

    • 從服務器到客戶端以及從客戶端到服務器的實時流量
    • 您需要使用具有事件循環的服務器
    • 借助WebSockets,可以從另一個域連接服務器。
    • 也可以使用第三方託管的websocket服務器,例如Pusherothers 。 這樣你就只需要實現客戶端,這很容易!
    • 如果你想閱讀更多,我發現這些非常有用:( article ), (article)tutorial )。

彗星:

Comet是HTML5之前的技術集合,它使用流式傳輸和長輪詢來實現實時應用程序。 閱讀更多關於wikipediathis文章。

現在,他們中的哪一個應該用於實時應用程序(我需要編碼)。 我一直聽到很多關於websockets(使用socket.io [一個node.js庫]),但為什麼不是PHP?

你可以使用PHP和WebSockets,看看Ratchet





server-sent-events