ロングポーリング、WebSocket、サーバー送信イベント(SSE)、Cometとは何ですか?


1048

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

これらのテクノロジーが何であるかを私に説明することで誰かがショットを撮りたいですか?

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

毎回出くわしたことの1つは、サーバーが接続を開いたままにし、データをクライアントにプッシュすることでした。接続はどのように開いたままにし、クライアントはどのようにしてプッシュされたデータを取得しますか?(クライアントはどのようにデータを使用しますか、おそらくいくつかのコードが役立つでしょう?)

さて、リアルタイムアプリにどちらを使用すればよいでしょうか。(socket.io [node.jsライブラリ]を使用して)websocketについて多くのことを聞いてきましたが、なぜPHPではないのですか?


1
リアルタイムwebsocketまたはwebrtc?PHPにはwebsocket用のライブラリがあります。ZMQまたはソケットプログラミングを使用して動作させるには、追加のコードを記述する必要があります。nodeJsはこのために構築されているため、簡単に利用できます。websocketがphpですぐに利用できない理由は、追加のターミナルを実行し、それを実行し続けてwebsocketサーバーがすぐに利用できるようにする必要があるためです。構造は、phpはJavaScriptのようなイベント構造ではないため、websocketはメッセージをキャッチして送信するためにイベント構造を使用します。
PauAI 2017

さらに、CometとServerSentイベントは、2つのサーバーを作成せずにほぼリアルタイムで(実際ではなく)達成するためのPHPの回避策です。
PauAI 2017

回答:


2077

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

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

通常のHTTP:

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

HTTP

Ajaxポーリング:

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

Ajaxポーリング

Ajaxロングポーリング:

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

Ajaxロングポーリング

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

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

HTML5 SSE

HTML5 Websockets:

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

    • サーバーからクライアントへ、およびクライアントからサーバーへのリアルタイムのトラフィック
    • あなたはイベントループを持つサーバーを使いたいでしょう
    • WebSocketを使用すると、別のドメインのサーバーに接続できます。
    • 例えば、サードパーティのホスト型のWebSocketサーバーを使用することも可能であるプッシャー他人。この方法では、クライアント側を実装するだけで済みます。これは非常に簡単です。
    • 詳細をお読みになりたい場合は、(記事)、(記事)チュートリアル)が非常に役立ちます。

HTML5 WebSocket

彗星:

コメットは、ストリーミングとロングポーリングを使用してリアルタイムアプリケーションを実現する、HTML5より前の手法のコレクションです。ウィキペディアまたはこの記事で詳細をお読みください。


ここで、リアルタイムアプリ(コーディングが必要)にどちらを使用すればよいでしょうか。(socket.io [node.jsライブラリ]を使用して)websocketについて多くのことを聞いてきましたが、なぜPHPではないのですか?

PHPをWebSocketで使用できます。ラチェットをチェックしてください。


21
これはすごい!私はSSEについて読んでいて、この記事を見つけました、それはとても素晴らしいです-今私がものを比較したように、ここにSSEを含めることもできますので、Websocketとの違いをクロスチェックすることもできますか?
インデックス

1
@Tiemeあれでしたか?SSEはサーバー送信イベントを意味すると思っていました。とにかく、ありがとうございます。
インデックス、

1
Q:phpでは、websocketを使用していて、すべてのクライアントがwsを使用してサーバーに接続しているとしましょう。それはnodejsでどのように異なりますか?nodejsが処理できる同時クライアントの数と、何が発生した場合に何が起こるか?
Muhammad Umer 2013

5
両方のソリューションで同じことを達成できますが、メカニズムは異なります。ロングポーリングは「通常の」httpデータを使用し、SSEは異なる基礎プロトコルを使用し、ロングポーリングと比較して異なるサーバー設定が必要です。
Tieme 2013年

2
必要に応じて、Apacheを使用できます。しかし、イベントループがあるため、多くの人がNode.jsを使用しています。ただし、Apacheについては、stackoverflow.com
questions / 12203443 /

37

Tiemeは彼の優れた答えに多くの労力を費やしましたが、私はOPの質問の核心は、これらのテクノロジーがどのようにPHPとどのように関連するかではなく、どのようにPHPに関連するかだと思います。

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

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

PHPには、PHPのユーザー空間でイベントループ(libeventなど)とスレッド(pthreadなど)を提供する拡張機能がありますが、これらを使用するアプリケーションはほとんどありません。

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

PHP 7は、これらの問題を修正するための優れたステップでもあり、リアルタイムアプリケーションのプラットフォームとして非常に有望です。


2
ここでわかるように、PHPは常にCで記述されていました。ここでは、「Museum.php.net/php1」を使用しています。たぶん、あなたは「よりファッショナブル」という意味ですか?
IMSoP 2014

@IMSoP-修正のおかげで、私はPHPを10年以上使用しており、そのルーツはPerlにあるという印象を常に持っています。PHPの履歴ページは、元々はCであったことも明確にサポートしています。しばらくしてから回答を編集します。
JSON

Perlは公式のドキュメントとうまく混ざっていないので、少しだけ削除しますが、これはまだPHPの初期の開発における混乱の領域です。
JSON

PHP 7は、リアルタイムアプリケーションのプラットフォームとして非常に有望に思われますか?リアルタイムアプリケーション用のPHP7の改善点/変更点は何ですか?
2015


9

私はこれらについて書き留めようとし、Javaの観点から例を集めて書きました。

Java開発者向けのHTTP

リバースAjax-古いスタイル

サーバー側での非同期処理

リバースAjax-新しいスタイル

サーバー送信イベント

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


これらのサイトのほとんどは機能しません!
Alexander Dunn

@AlexanderDunnよろしくお願いします。更新されたリンクで修正します
John

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.