ホームページ  >  記事  >  PHPフレームワーク  >  swoole の onreceive がトリガーされない

swoole の onreceive がトリガーされない

(*-*)浩
(*-*)浩オリジナル
2019-12-14 14:13:012530ブラウズ

swoole の onreceive がトリガーされない

#onReceive

この関数は、ワーカー プロセスで発生するデータの受信時にコールバックされます。 関数プロトタイプ: (推奨学習: swoole ビデオ チュートリアル )

function onReceive(swoole_server $server, int $fd, int $reactor_id, string $data);

$server、サーバー オブジェクト

$fd、TCP クライアント接続の一意の識別子

$reactor_id、TCP 接続が配置されている Reactor スレッド ID

$data、受信したデータのコンテンツはテキストまたはバイナリ コンテンツである可能性があります

$fd について$actor_idの詳細説明

自動プロトコル処理オプションがオンでない場合、onReceiveで一度に受信できる最大データは64K

自動プロトコル処理オプションがオンの場合、onReceive は完全なデータ パケットを受信します。最大値は package_max_length を超えません。

バイナリ形式をサポートします。$data はバイナリ データの場合があります。

によって提供される open_eof_check/open_length_check/open_http_protocol を使用します。データ パッケージの整合性を確保するための最下層です。

基盤となるプロトコル処理を使用せず、onReceive 以降の PHP コード内でデータを独自に分析し、データ パケットをマージ/分割します。

例: $buffer = array() をコードに追加し、$fd をキーとして使用してコンテキスト データを保存できます。データを受信するたびに、文字列の結合 $buffer[$fd] .= $data が実行され、$buffer[$fd] 文字列が完全なデータ パケットであるかどうかが判断されます。

デフォルトでは、同じ fd が同じ Worker に割り当てられるため、データを結合できます。 dispatch_mode = 3を使用する場合。

データの要求はプリエンプティブであり、同じ fd から送信されたデータが異なるプロセスに分割される場合があります。したがって、上記のデータ パケット スプライシング方法は使用できません。

SMTP プロトコルなどのスティッキー パケットの問題に関して、クライアントは同時に 2 つの命令を発行する可能性があります。サーバーで一度に受信される場合もありますが、その場合はアプリケーション層が独自に解凍する必要があります。 SMTP は \r\n を通じてサブパッケージ化されているため、データ パケットを分割するにはビジネス コードでexplode("\r\n", $data) が必要です。

リクエスト/レスポンス サービスの場合、データの分割を考慮する必要はありません。その理由は、クライアントがリクエストを開始した後、2 番目のリクエストを開始する前に、サーバーが現在のリクエストの応答データを返すまで待機する必要があるためです。同時に 2 つのリクエストは送信されません

以上がswoole の onreceive がトリガーされないの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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