ホームページ  >  記事  >  バックエンド開発  >  スウールの構造解析

スウールの構造解析

不言
不言オリジナル
2018-08-06 10:13:382773ブラウズ

この記事の内容は swoole のアーキテクチャ解析に関するものであり、一定の参考価値がありますので、困っている方は参考にしていただければ幸いです。

構造図は次のとおりです。

swoole は、主に Master プロセス (メイン プロセス) と Manager プロセスによって使用され、そのプロセスを完了します。機能。

マスタープロセス

はマルチスレッドプログラムです。 Reactor スレッドと呼ばれる非常に重要なスレッドのグループがあります。実際に TCP 接続を処理し、データを送受信するのはスレッドです。

マネージャープロセス

ワーカー/タスクプロセスを管理します。ワーカー/タスク プロセスはすべてフォークされ、Manager プロセスによって管理されます。

Reactor スレッド

新しい接続を受け入れた後、メイン スレッド (マスター プロセス) は固定の Reactor スレッドに接続を割り当て、このスレッドはソケットの監視を担当します。ソケットが読み取り可能なときにデータを読み取り、プロトコル分析を実行して、リクエストをワーカー プロセスに配信します。

  • #クライアント

    TCP接続の維持、ネットワークの処理IO、プロトコルの処理、データの送受信

  • 完全に

    非同期ノンブロッキング モード

  • Start/ を除くすべては C コードですシャットダウン イベント コールバックを除き、PHP コードは実行されません

  • TCP クライアントによって送信されたデータをバッファリングし、結合し、完全なリクエスト データに分割しますパッケージ

  • Reactorマルチスレッドで実行

作業プロセス

phpに似ています- fpmプロセス。

  • Reactor スレッドによって配信されたリクエスト パケットを受け入れ、PHP コールバック関数を実行してデータを処理します

  • 応答データを生成し、

    Reactor スレッドに送信します。このデータは、Reactor スレッドによって TCP クライアント # に送信されます。

  • ##はい、非同期モードまたは同期モードです
  • Worker

    マルチプロセス モードで実行します

  • TaskWorkerプロセス

他のタスクを非同期に処理するプロセスで、使用方法はGearmanと同様です。

  • Worker

    プロセスによって swoole_server->task/taskwait メソッドを通じて配信されたタスクを受け入れます

  • タスクを処理し、結果データ (
  • swoole_server->finish

    ) を Worker process

  • TaskWorker に返します。

    マルチプロセス モードで実行する

  • 関係

は、

Reactor

nginx、## であると理解できます。 #Workerphp-fpm です。 Reactorスレッドはネットワーク要求を非同期かつ並行して処理し、それを処理のためにWorkerプロセスに転送します(コールバック関数で処理されます)。 ReactorWorkerUnixSocket を通じて通信します。

イベント処理プロセス

#スウール イベント処理プロセスを理解するには、まず 2 つのネットワーク イベント処理モードを理解します。

リアクター モード

メイン スレッド (I/O 処理ユニット) は、ファイル記述子にイベントがあるかどうかのみを監視し、イベントがある場合は直ちにワーカー スレッド/プロセスに通知する必要があります。イベントの(論理ユニット)。それ以外、メインスレッドは他の作業を行いません。データの読み取りと書き込み、新しい接続の受け入れ、顧客リクエストの処理はすべてワーカー スレッドで行われます。

プロアクター モード

2 つの実装

I/O 非同期モデルを使用してプロアクター モードを実装します。原則: すべての I/O 操作はメイン スレッドに渡され、メイン スレッドはカーネルと連携して処理し、ビジネス ロジック操作はロジック ユニットに渡されます。たとえば、これを実現するには aio_read を使用します。

ワークフロー:

メインスレッドは、aio_read 関数を呼び出して、ソケット上の読み取り完了イベントをカーネルに登録します。
  1. メインスレッドは他の I/O イベントの処理を続けます。
  2. ソケット上のデータがユーザー バッファーに読み込まれると、カーネルはアプリケーション (論理ユニット) に信号を送信して、データが利用可能であることをアプリケーションに通知します。
  3. アプリケーションはデータ (クライアント要求) を読み取り、処理後に aio_write 関数を呼び出して、ソケット上の書き込みイベントをカーネルに登録します。
  4. メインスレッドは他のロジックの処理を続けます。
  5. ユーザー バッファー内のデータがソケットに書き込まれると、カーネルはアプリケーションに信号を送信して、データが送信されたことをアプリケーションに通知します。
  6. アプリケーションには、ソケットのクローズなどの余波を処理するための事前定義された信号処理関数があります。
  7. I/O 同期を使用するProactor モデルを実装するためのモデル。原則: メインスレッドは I/O イベント データの読み取りおよび書き込み操作を実行し、ビジネス ロジック操作はロジック ユニットに引き渡されます。たとえば、これを実現するには epoll を使用します。
ワークフロー:

メインスレッドは、ソケット上の読み取り準備完了イベントを epoll カーネル イベント テーブルに登録します。
  1. メインスレッドは epoll_wait を呼び出して、ソケット上でデータが読み取られるのを待ちます。
  2. epoll_wait が戻った後、メインスレッドはソケットからデータを読み取り、読み取ったデータをリクエスト オブジェクト (クライアントのリクエスト) にカプセル化し、リクエスト キューに挿入します。
  3. したがって、キューのコンシューマ スレッドはリクエスト オブジェクトを処理し、ソケット上の書き込み準備完了イベントを epoll カーネル イベント テーブルに登録します。

  4. メインスレッドは epoll_wait を呼び出して、ソケットが書き込み可能になるのを待ちます。

  5. ソケットが書き込み可能になると、epoll_wait がメインスレッドに通知します。メインスレッドはリクエスト結果をソケットに書き込みます。

swoole イベント アーキテクチャ図

図からわかるように、Reactor スレッドと Work プロセスを組み合わせると、これは、ワーカー スレッドの場合、swoole はリアクター イベント処理モードを使用することがわかります。

リクエストが実行するステップは次のとおりです:

1. サーバーのメインスレッドはクライアントの接続を待ちます。

2. Reactor スレッドは、接続されたソケットを処理し、ソケット上のリクエスト データを読み取り (受信)、リクエストをカプセル化し、ワーク プロセスに渡します。

3. 作業プロセスは、ビジネス データを処理する論理単位です。

4. 作業プロセスの結果は Reactor スレッドに返されます。

5. Reactor スレッドは結果をソケットに書き込みます (送信)。

各モジュールの動作については、上記の構造の紹介を参照してください。

関連する推奨事項:

モデルをカスタマイズするにはどうすればよいですか? ThinkPHP3.2 カスタム基本クラス Model

PHP を使用して Excel ファイルの内容を読み取り、セル データを取得する方法

以上がスウールの構造解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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