1139

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

これらのテクノロジーが何であるかを私に説明してみませんか?

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

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

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

4

4 に答える 4

2211

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

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

通常のHTTP:

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

HTTP

Ajaxポーリング:

  1. クライアントは、通常のHTTPを使用してサーバーにWebページを要求します(上記のHTTPを参照)。
  2. クライアントは要求されたWebページを受信し、サーバーからファイルを要求するページでJavaScriptを定期的に(たとえば0.5秒)実行します。
  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 Websocket:

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

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

HTML5 WebSocket

彗星:

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


さて、それらのどれをリアルタイムアプリに使用する必要がありますか(コーディングする必要があります)。私はWebSocket(socket.io [node.jsライブラリ]を使用)について多くのことを聞いていますが、なぜPHPではないのですか?

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

于 2012-10-12T08:57:44.533 に答える
42

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

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

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

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

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

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

于 2014-10-14T07:11:26.410 に答える
8

ポーリング

基本的に、ポーリングは、定期的にサーバーに情報を要求する手法です。この接続は、HTTPプロトコルに従って行われます。ポーリングには2つのタイプがあります。

  1. 短いポーリング
  2. ロングポーリング

短いポーリング

短いポーリングでは、クライアントはサーバーに情報を要求します。サーバーはリクエストを処理します。リクエストにデータが利用できる場合、サーバーは必要な情報を使用してリクエストに応答します。ただし、サーバーにクライアントで使用可能なデータがない場合、サーバーは空の応答を返します。どちらの場合も、応答を返した後、接続は閉じられます。サーバーが空の応答を送信した後でも、クライアントは新しい要求を発行し続けます。このメカニズムにより、サーバーのネットワークコストが増加します。

長いポーリング

長いポーリングでは、クライアントはサーバーがすぐに応答しない可能性があることを期待して、サーバーに情報を要求できます。サーバーがリクエストを受信したときに、クライアントの新しいデータがない場合、サーバーは空のレスポンスを返すのではなく、リクエストを開いたままにして、データが到着するのを待ちます。サーバーは新しいデータを受信すると、すぐにクライアントに応答を配信し、オープンリクエストを完了します。クライアントは、サーバーから回答を取得した後、新しい更新の別の要求を送信できます。長いポーリングは、空の応答の数を減らすことによってコストを削減します。

WebSocket

WebSocketは、単一のTCP接続を介して双方向(双方向)の通信チャネルを提供するプロトコルです。Websocketは、クライアントとサーバー間の永続的な接続を容易にし、両方の当事者がいつでもデータの転送を開始できるようにします。WebSocketハンドシェイクは、クライアントがWebSocket接続を作成するための手順です。操作が成功すると、サーバーとクライアントはいつでもデータを送受信できます。主にWhatsApp、UberなどのリアルタイムWebアプリケーションで使用されます。

サーバー送信イベント(SSE)

WebSocketとは異なり、SSEは一方向接続であるため、SSEを使用してクライアントからサーバーにリクエストを発行することはできません。サーバーからクライアントへの「ほぼリアルタイム」の送信が必要な場合、またはサーバーがループでデータを生成する場合は、SSEが理想的な選択肢です。

彗星

Cometは、ネイティブHTTPメソッドを使用したサーバーとWebブラウザー間の継続的な双方向の対話を記述するWebアプリケーション設計パラダイムです。コメットは総称です。Ajaxプッシュ、HTTPストリーミング、およびHTTPサーバープッシュは、このイベント駆動型の対話を提供するために使用できるHTTPメカニズムの一部です。

于 2021-05-30T06:27:00.180 に答える
1

WebアプリでNode.JSを簡単に使用できるのは、リアルタイム通信のみです。Node.JSは、WebSocketに関しては非常に強力です。したがって、「Node.jsを介したPHP通知」は素晴らしい概念です。

この例を参照してください: PHPとNode.jsを使用したリアルタイムチャットアプリの作成

于 2019-04-14T16:38:16.260 に答える