ホームページ > 記事 > PHPフレームワーク > 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 サイトの他の関連記事を参照してください。