スウールの構造解析
この記事の内容は swoole のアーキテクチャ解析に関するものであり、一定の参考価値がありますので、困っている方は参考にしていただければ幸いです。
構造図は次のとおりです。
swoole は、主に Master プロセス (メイン プロセス) と Manager プロセスによって使用され、そのプロセスを完了します。機能。
マスタープロセス
はマルチスレッドプログラムです。 Reactor スレッドと呼ばれる非常に重要なスレッドのグループがあります。実際に TCP 接続を処理し、データを送受信するのはスレッドです。
マネージャープロセス
ワーカー/タスクプロセスを管理します。ワーカー/タスク プロセスはすべてフォークされ、Manager プロセスによって管理されます。
Reactor スレッド
新しい接続を受け入れた後、メイン スレッド (マスター プロセス) は固定の Reactor スレッドに接続を割り当て、このスレッドはソケットの監視を担当します。ソケットが読み取り可能なときにデータを読み取り、プロトコル分析を実行して、リクエストをワーカー プロセスに配信します。
- #クライアント
TCP
接続の維持、ネットワークの処理
IO、プロトコルの処理、データの送受信
- 完全に
非同期ノンブロッキング モード
Start
/
を除くすべてはC
コードですシャットダウンイベント コールバックを除き、PHP コードは実行されません
TCP
クライアントによって送信されたデータをバッファリングし、結合し、完全なリクエスト データに分割しますパッケージ
Reactor
マルチスレッドで実行
-
Reactor
スレッドによって配信されたリクエスト パケットを受け入れ、
PHPコールバック関数を実行してデータを処理します
- 応答データを生成し、
Reactor
スレッドに送信します。このデータは、
Reactorスレッドによって
TCPクライアント
# に送信されます。 ##はい、非同期モードまたは同期モードです - Worker
マルチプロセス モードで実行します
TaskWorkerプロセス
他のタスクを非同期に処理するプロセスで、使用方法はGearmanと同様です。
- Worker
プロセスによって
swoole_server->task/taskwait
メソッドを通じて配信されたタスクを受け入れます タスクを処理し、結果データ ( - swoole_server->finish
) を
Worker
process - TaskWorker に返します。
マルチプロセス モードで実行する
関係
は、
Reactor が nginx
、## であると理解できます。 #Worker は
php-fpm です。
Reactorスレッドはネットワーク要求を非同期かつ並行して処理し、それを処理のために
Workerプロセスに転送します(コールバック関数で処理されます)。
Reactor と
Worker は
UnixSocket を通じて通信します。
#スウール イベント処理プロセスを理解するには、まず 2 つのネットワーク イベント処理モードを理解します。
リアクター モードメイン スレッド (I/O 処理ユニット) は、ファイル記述子にイベントがあるかどうかのみを監視し、イベントがある場合は直ちにワーカー スレッド/プロセスに通知する必要があります。イベントの(論理ユニット)。それ以外、メインスレッドは他の作業を行いません。データの読み取りと書き込み、新しい接続の受け入れ、顧客リクエストの処理はすべてワーカー スレッドで行われます。 プロアクター モード2 つの実装I/O 非同期モデルを使用してプロアクター モードを実装します。原則: すべての I/O 操作はメイン スレッドに渡され、メイン スレッドはカーネルと連携して処理し、ビジネス ロジック操作はロジック ユニットに渡されます。たとえば、これを実現するには aio_read を使用します。 ワークフロー: メインスレッドは、aio_read 関数を呼び出して、ソケット上の読み取り完了イベントをカーネルに登録します。- メインスレッドは他の I/O イベントの処理を続けます。
- ソケット上のデータがユーザー バッファーに読み込まれると、カーネルはアプリケーション (論理ユニット) に信号を送信して、データが利用可能であることをアプリケーションに通知します。
- アプリケーションはデータ (クライアント要求) を読み取り、処理後に aio_write 関数を呼び出して、ソケット上の書き込みイベントをカーネルに登録します。
- メインスレッドは他のロジックの処理を続けます。
- ユーザー バッファー内のデータがソケットに書き込まれると、カーネルはアプリケーションに信号を送信して、データが送信されたことをアプリケーションに通知します。
- アプリケーションには、ソケットのクローズなどの余波を処理するための事前定義された信号処理関数があります。
- I/O 同期を使用するProactor モデルを実装するためのモデル。原則: メインスレッドは I/O イベント データの読み取りおよび書き込み操作を実行し、ビジネス ロジック操作はロジック ユニットに引き渡されます。たとえば、これを実現するには epoll を使用します。
- メインスレッドは epoll_wait を呼び出して、ソケット上でデータが読み取られるのを待ちます。
- epoll_wait が戻った後、メインスレッドはソケットからデータを読み取り、読み取ったデータをリクエスト オブジェクト (クライアントのリクエスト) にカプセル化し、リクエスト キューに挿入します。
したがって、キューのコンシューマ スレッドはリクエスト オブジェクトを処理し、ソケット上の書き込み準備完了イベントを epoll カーネル イベント テーブルに登録します。
メインスレッドは epoll_wait を呼び出して、ソケットが書き込み可能になるのを待ちます。
ソケットが書き込み可能になると、epoll_wait がメインスレッドに通知します。メインスレッドはリクエスト結果をソケットに書き込みます。
swoole イベント アーキテクチャ図
図からわかるように、Reactor スレッドと Work プロセスを組み合わせると、これは、ワーカー スレッドの場合、swoole はリアクター イベント処理モードを使用することがわかります。
リクエストが実行するステップは次のとおりです:
1. サーバーのメインスレッドはクライアントの接続を待ちます。
2. Reactor スレッドは、接続されたソケットを処理し、ソケット上のリクエスト データを読み取り (受信)、リクエストをカプセル化し、ワーク プロセスに渡します。
3. 作業プロセスは、ビジネス データを処理する論理単位です。
4. 作業プロセスの結果は Reactor スレッドに返されます。
5. Reactor スレッドは結果をソケットに書き込みます (送信)。
各モジュールの動作については、上記の構造の紹介を参照してください。
関連する推奨事項:
モデルをカスタマイズするにはどうすればよいですか? ThinkPHP3.2 カスタム基本クラス Model
PHP を使用して Excel ファイルの内容を読み取り、セル データを取得する方法
以上がスウールの構造解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











多くの場合、キーワードと追跡パラメーターで散らかった長いURLは、訪問者を阻止できます。 URL短縮スクリプトはソリューションを提供し、ソーシャルメディアやその他のプラットフォームに最適な簡潔なリンクを作成します。 これらのスクリプトは、個々のWebサイトにとって価値があります

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

これは、LaravelバックエンドとのReactアプリケーションの構築に関するシリーズの2番目と最終部分です。シリーズの最初の部分では、基本的な製品上場アプリケーションのためにLaravelを使用してRESTFUL APIを作成しました。このチュートリアルでは、開発者になります

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

2025 PHP Landscape Surveyは、現在のPHP開発動向を調査しています。 開発者や企業に洞察を提供することを目的とした、フレームワークの使用、展開方法、および課題を調査します。 この調査では、現代のPHP Versioの成長が予想されています

この記事では、Laravel Webフレームワークの通知システムを検討します。 Laravelの通知システムを使用すると、さまざまなチャネルでユーザーに通知を送信できます。今日は、通知ovを送信する方法について説明します
