[PHP]swoole_server进程の分工
要約: Swoole は、PHP 言語の高性能ネットワーク通信フレームワークであり、PHP 言語の非同期マルチスレッド サーバー、非同期 TCP/UDP ネットワーク クライアント、非同期 MySQL、データベース接続プール、AsyncTask、メッセージ キュー、ミリ秒タイマー、非同期ファイルの読み取りと書き込み、非同期 DNS クエリ。強力な機能は、明確な分業を伴う複数のプロセスによって実現されます。ここでは、初心者が Swoole フレームワークをより早く理解できるように、いくつかのプロセスの分業について詳しく紹介します。 Pブログ:http://www.cnblogs.com/jhzhu
メールボックス:jhzhuustc@gmail.com
- 著者:Zhiming So時間:2015-08-17
-
- ディレクトリ
-
-
[PHP] swoole_serverプロセスの分業ディレクトリ- Swooleの紹介
- Swoole: PHPの再定義
- 関数表示コードスニペット
- TCPサーバー
TCPクライアント
メインプロセス分析
マスタープロセス
マネージャープロセス
ワーカープロセス
タスクプロセス
プロセスとイベントコールバックの対応関係
Masterプロセスのコールバック関数
Workerプロセスのコールバック関数
Taskプロセスのコールバック関数
Managerプロセスのコールバック関数
-
- Swooleの紹介
- Swoole公式ウェブサイト
- Swoole: PHPの再定義
Swoole: PHP言語用の高性能ネットワーク通信フレームワークで、PHP言語の非同期マルチスレッドサーバー、非同期TCP/UDPネットワーククライアント、非同期MySQL、データベース接続プール、AsyncTask、メッセージ キュー、ミリ秒タイマー、非同期ファイルの読み取りと書き込み、非同期 DNS クエリ。
Swoole は標準的な PHP 拡張機能ですが、実は通常の拡張機能とは異なります。通常の拡張機能はライブラリ関数を提供するだけです。 swoole 拡張機能は、実行後に PHP の制御を引き継ぎ、イベント ループに入ります。 IO イベントが発生すると、swoole は指定された PHP 関数を自動的にコールバックします。
関数表示コードスニペット
TCPサーバー
$serv = new swoole_server("127.0.0.1", 9501);$serv->set(array( 'worker_num' => 8, //工作进程数量 'daemonize' => true, //是否作为守护进程));$serv->on('connect', function ($serv, $fd){ echo "Client:Connect.\n";});$serv->on('receive', function ($serv, $fd, $from_id, $data) { $serv->send($fd, 'Swoole: '.$data); $serv->close($fd);});$serv->on('close', function ($serv, $fd) { echo "Client: Close.\n";});$serv->start();
ログイン後にコピー
- TCPクライアント
$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);//设置事件回调函数$client->on("connect", function($cli) { $cli->send("hello world\n");});$client->on("receive", function($cli, $data){ echo "Received: ".$data."\n";});$client->on("error", function($cli){ echo "Connect failed\n";});$client->on("close", function($cli){ echo "Connection close\n";});//发起网络连接$client->connect('127.0.0.1', 9501, 0.5);
ログイン後にコピー
その他のコードスニペットについては、swoole公式Webサイトをご覧ください。
メインプロセス分析
マスタープロセス
マスタープロセスは主に、Swooleフレームワークメカニズムの動作を確認するために使用されます。いくつかの機能スレッドが作成されます:
- リアクター スレッド: 実際に TCP 接続を処理し、データを送受信するスレッドです。新しい接続を受け入れた後、swoole のメイン スレッドはその接続を固定 Reactor スレッドに割り当て、このスレッドがソケットの監視を担当します。ソケットが読み取り可能なときにデータを読み取り、プロトコル分析を実行して、リクエストをワーカー プロセスに配信します。ソケットが書き込み可能なときに、TCP クライアントにデータを送信します。
- マスター スレッド (メイン スレッド): 新しい接続の受け入れ、UNIX PROXI 信号処理、およびタイマー タスクを担当します。
- ハートビートパケット検出スレッド:(省略)
- UDPパケット受信スレッド:(省略)
Managerプロセス
swoole内のWorker/Taskプロセスは全てForkされてManagerプロセスによって管理されます。
子プロセスが終了すると、マネージャー プロセスは、ゾンビ プロセスになるのを避けるために子プロセスをリサイクルする責任があります。そして、新しい子プロセスを作成します- サーバーがシャットダウンすると、マネージャープロセスはすべての子プロセスにシグナルを送信し、子プロセスにサービスを閉じるように通知します
- サーバーがリロードすると、マネージャープロセスは子プロセスを閉じ/再起動します1 つずつ
-
- なぜ Master プロセスではないのか 主な理由は、Master プロセスがマルチスレッドであり、フォーク操作を安全に実行できないことです。
onWorkerStart
在task进程中也会被调用。当$worker_id >= $serv->setting['worker_num']
ワーカープロセス
Reactor スレッドによって配信されたリクエストパケットを受け取り、PHP コールバック関数を実行してデータを処理します
応答データを生成して Reactor スレッドに送信し、TCP クライアントに送信します
非同期および非ブロッキング モードにすることも、同期ブロッキング モードにすることもできます
ワーカーはマルチプロセス モードで実行されます
ワーカー プロセスが致命的なエラーなどで異常終了した場合、Swoole は完全なプロセス管理メカニズムを提供します。 PHP では、他のプログラムによって誤って強制終了されたか、max_request 回後に正常に終了しました。メインプロセスは新しいワーカープロセスを再起動します。通常のapache+phpやphp-fpmと同様にワーカープロセス内でコードを記述できます。 Node.js のような非同期コールバック コードを記述する必要はありません。
タスクプロセス
swoole_server->task/taskwaitメソッドを通じてワーカープロセスから配信されたタスクを受け取りますタスクを処理し、結果データをワーカープロセスに返します