ホームページ >PHPフレームワーク >Swoole >swoole はどのようなプロトコルを使用しますか?

swoole はどのようなプロトコルを使用しますか?

(*-*)浩
(*-*)浩オリジナル
2019-12-06 10:44:452797ブラウズ

swoole はどのようなプロトコルを使用しますか?

#TCP はストリーミング プロトコルであり、クライアントがデータをサーバーに送信した後、サーバーが一度にデータを完全に受信できない場合があります。クライアントは複数のデータをサーバーに送信し、サーバーはそれらをすべて一度に受信することがあります。 (推奨学習: swoole ビデオチュートリアル )

実際のアプリケーションでは、サーバーが一度にそれ以上でもそれ以下でも完全なデータを受信できることを望みます。

従来の TCP サーバーでは、プログラマは多くの場合、キャッシュ領域を維持し、最初に読み取ったデータをキャッシュ領域に書き込み、次に事前設定されたプロトコルの内容を通じて完全なデータの始まりを区別する必要がありました。長さを調整し、処理のために完全なデータを論理部分に渡します。これがカスタム プロトコルの機能です。

Swoole では、データ キャッシュ領域が最下層に実装されており、一般的に使用されるいくつかのプロトコル タイプが組み込まれています。データは、onReceive コールバック関数内で確実に処理されるように、最下層で直接分割されています。 、確実 1 つまたは複数の完全なデータ セグメントを受信できます。

データ バッファーのサイズは、pakcage_max_length を構成することで制御できます。

$configs = [];
$configs["package_max_length"] = 8192;
$server->set($configs);

swoole は現在、EOF ターミネータ プロトコルと固定ヘッダーとボディ プロトコルの 2 つの通信プロトコルをサポートしています。

package_max_length

package_max_length は、最大パケット サイズの設定に使用されます。 open_length_check、open_eof_check、open_http_protocol などのプロトコル解析がオンになっている場合、Swoole の最下層でデータ パケットのスプライシングが処理され、データ パケットが完全に受信されていない場合、すべてのデータがメモリに保存されます。

したがって、package_max_length をデータ パケットの最大許容メモリ サイズに設定する必要があります。

同時にデータを送信する 10,000 の TCP 接続がある場合、各データ パケットは 2MB であり、最も極端なケースでは 20GB のメモリ領域を占有することになります。したがって、このパラメータはあまり大きく設定しないでください。大きくしすぎると、大量のメモリを占有することになります。

関連構成オプション

open_length_check

データ パケットの長さが package_max_length を超えることが判明した場合、データは直接破棄され、接続が閉じられるため、メモリを占有せず、WebSocket、MQTT、http2 プロトコルに適しています。

open_eof_check

データ パケットの長さを事前に知ることはできないため、受信したデータは引き続きメモリに保存され、増加し続けます。メモリ使用量が package_max_length を超えていることが判明した場合、データ パケットは直接ドロップされ、接続が閉じられます。

open_http_protocol

HTTP GET リクエストでは最大 8KB のデータが許可され、この構成は変更できません。POST リクエストでは Content-Type が検出されます。package_max_length を超えていることが判明した場合、データは直接破棄されます、HTTP 400 エラーが送信され、接続が閉じられます。

EOF プロトコル

通常のデータには表示されない文字列 /r/n の固定セットを、EOF プロトコルと呼ばれる分割プロトコルのマークとして使用します。

EOF プロトコルとは何ですか?

EOF はファイルの終わりを表し、終了タグとして \r\n を使用します。

データ ストリーム内のデータを 1 つずつ読み取ったときに、EOF マークが見つかった場合は、データの終わりを読み取ったことを意味します。

TCP データ フローにおいて、EOF プロトコルを使用するデータ フローの特性は |data|EOF|data|EOF| です。

EOFプロトコルの処理原理は、通常のデータ列の最後に、そのデータには決して出現しない所定の文字列をエンドマークとして付加することで、受信データにマークを付けることができます。 EOFに従ってデータを分割します。

一般的な memcached、ftp、および stmp はすべて、ターミネータとして /r/n を使用します。データを送信するときは、データ パケットの最後に /r/n を追加するだけです。

EOF プロトコル処理を使用する場合は、データ パケットの途中で EOF が発生しないようにする必要があります。そうしないと、サブパッケージング エラーが発生します。

swoole はどのようなプロトコルを使用しますか?

以上がswoole はどのようなプロトコルを使用しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。