web-dev-qa-db-ja.com

ロングポーリング、Webソケット、サーバー送信イベント(SSE)、および彗星とは何ですか?

私はいくつかの記事を読んでみましたが、その概念についてはまだはっきりしていません。

誰かが私にこれらの技術が何であるかを説明するのを狙って撮りたいですか。

  1. ロングポーリング
  2. サーバー送信イベント
  3. Webソケット
  4. 彗星

私が毎回出会ったことの1つは、サーバーが接続を開いたままにし、データをクライアントにプッシュすることでした。接続はどのように開かれた状態で維持され、クライアントはどのようにプッシュデータを取得しますか? (クライアントはデータをどのように使用していますか、多少のコード​​が役に立つかもしれません)。

今、私はリアルタイムアプリケーションのためにそれらのうちどれを使うべきですか。私は(socket.io [node.jsライブラリ]で)ウェブソケットについて多くのことを聞いていますが、なぜPHPではないのですか?

951
user1437328

以下の例では、クライアントはブラウザ、サーバーはWebサイトをホストしているWebサーバーです。

これらのテクノロジを理解する前に、まずclassic HTTP Webトラフィックについて理解する必要があります。

通常のHTTP

  1. クライアントがサーバーにWebページを要求します。
  2. サーバーは応答を計算します
  3. サーバーは応答をクライアントに送信します。

HTTP

Ajax Polling:

  1. クライアントは、通常のHTTPを使用してサーバーにWebページを要求します(上記のHTTPを参照)。
  2. クライアントは要求されたウェブページを受信し、定期的に(例えば0.5秒)サーバからファイルを要求するページ上でジャバスクリプトを実行する。
  3. 通常のHTTPトラフィックと同様に、サーバーは各応答を計算してそれを送り返します。

Ajax Polling

Ajaxロングポーリング:

  1. クライアントは、通常のHTTPを使用してサーバーにWebページを要求します(上記のHTTPを参照)。
  2. クライアントは要求されたWebページを受信し、サーバーからファイルを要求するページでJavaScriptを実行します。
  3. サーバーは要求された情報ですぐには応答しませんが、 new informationが利用可能になるまで待ちます。
  4. 利用可能な新しい情報がある場合、サーバーは新しい情報で応答します。
  5. クライアントは新しい情報を受け取り、すぐに別の要求をサーバーに送信して、プロセスを再開します。

Ajax Long-Polling

HTML5サーバー送信イベント(SSE)/イベントソース:

  1. クライアントは、通常のHTTPを使用してサーバーにWebページを要求します(上記のHTTPを参照)。
  2. クライアントは要求されたWebページを受け取り、そのページでJavaScriptを実行してサーバーへの接続を開きます。
  3. 利用可能な新しい情報がある場合、サーバーはイベントをクライアントに送信します。

    • サーバーからクライアントへのリアルタイムのトラフィック。ほとんどがそれです。
    • イベントループがあるサーバーを使いたいでしょう
    • 他のドメインのサーバーとの接続は可能です 正しいCORS設定で
    • もっと読みたいのであれば、 (article)(article)(article)(tutorial) のようにとても便利です。

HTML5 SSE

HTML5 Webソケット:

  1. クライアントは、通常のhttpを使用してサーバーにWebページを要求します(上記のHTTPを参照)。
  2. クライアントは要求されたWebページを受け取り、そのページでJavaScriptを実行してサーバーとの接続を開きます。
  3. サーバーとクライアントは、新しいデータ(どちらかの側)が使用可能になったときに互いにメッセージを送信できるようになりました。

    • サーバーからクライアントへのリアルタイムトラフィック および からクライアントからサーバーへ
    • イベントループがあるサーバーを使いたいでしょう
    • WebSocketsを使用すると、別のドメインからサーバーに接続することが可能です。
    • Pusher または others のように、サードパーティがホストするWebSocketサーバーを使用することもできます。これにより、クライアント側を実装するだけで済みます。これは非常に簡単です。
    • あなたがもっと読みたいなら、私はこれらが非常に役に立つとわかりました:( article )、 (article)tutorial )。

HTML5 WebSockets

彗星:

Cometは、リアルタイムアプリケーションを実現するためにストリーミングとロングポーリングを使用するHTML 5以前の技術の集まりです。 ウィキペディア または この 記事を読んでください。


今、それらのうちどれを私がコーディングする必要があるリアルタイムアプリに使うべきです。私は(socket.io [node.jsライブラリ]で)ウェブソケットについてたくさん聞いていますが、なぜPHPではないのですか?

WebSocketでPHPを使うことができます、 Ratchet をチェックしてください。

1962
Tieme

Tiemeは彼のすばらしい答えに多くの努力を注ぎました、しかし私はOPの質問の核心はこれらの技術がどのようにPHPに関係するかではなく各技術がどのように働くかであると思います。

PHPは、明白なクライアントサイドのhtml、css、およびjavascript以外に、Web開発で最も使用されている言語です。それでも、リアルタイムアプリケーションに関してはPHPには2つの大きな問題があります。

1)PHPは非常に基本的なCGIとして始まりました。 PHPは初期の段階から非常に進歩していますが、小さなステップで起こりました。 PHPは、今日の組み込み可能で柔軟なCライブラリになるまでに、すでに何百万ものユーザーを抱えています。そのほとんどは、以前の実行モデルに依存していたため、まだ作成されていません。内部的にcgiモデルを回避しようとする確固たる試み。コマンドラインインタフェースでさえ、PHPライブラリ(Linuxの場合はlibphp5.so、Windowsの場合はphp5ts.dllなど)が、まだGET/POST要求を処理するcgiであるかのように起動します。まだ「ページ」を作成してライフサイクルを終了する必要があるかのように、コードを実行します。その結果、マルチスレッドまたはイベントドリブンプログラミング(PHP userspace内)はほとんどサポートされておらず、リアルタイムのマルチユーザーアプリケーションには現在実用的ではありません。

PHPには、PHPユーザースペースにイベントループ(libeventなど)およびスレッド(pthreadなど)を提供するための拡張機能がありますが、ごくわずかに、これらを使用するアプリケーションはほとんどありません。

2)PHPはまだガベージコレクションに関して重大な問題を抱えています。これらの問題は常に改善されてきましたが(上記のようにライフサイクルを終了するための最大のステップと思われます)、長時間実行するPHPアプリケーションを作成する最善の試みでも定期的に再起動する必要があります。これはまた、リアルタイムアプリケーションには実用的ではありません。

PHP 7もこれらの問題を解決するための素晴らしいステップとなるでしょう、そしてリアルタイムアプリケーションのプラットフォームとして非常に有望に思われます。

35
JSON

私はこれらについて書き留めてみて、 Javaの観点から例を集めて書いた

Java開発者のためのHTTP

逆Ajax - オールドスタイル

サーバー側の非同期処理

Reverse Ajax - 新しいスタイル

サーバー送信イベント

同じテーマを検討しているすべてのJava開発者のためにここにそれを置く。

9
John

WebアプリケーションでNode.JSを使用できるのは、リアルタイム通信だけです。 Node.JSは、WebSocketの場合は非常に強力です。したがって、「Node.jsを介したPHP通知」は素晴らしい概念です。

この例を参照してください。 PHPおよびNode.jsを使用したリアルタイムチャットアプリケーションの作成

0
Supun Kavinda