#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 はどのようなプロトコルを使用しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。