ホームページ > バックエンド開発 > PHPチュートリアル > [PHP]swoole_server の複数のプロセス間の分業

[PHP]swoole_server の複数のプロセス間の分業

WBOY
リリース: 2016-06-13 12:24:01
オリジナル
949 人が閲覧しました

[PHP]swoole_server几个进程的分工

readme.md—/Users/zjh/Documents/我的文章/[PHP]swoole_server几个进程的分工

[PHP]swoole_server 进程の分工


要旨: Swoole は PHP 语言の高性能ネットワーク通信フレームであり、PHP 语言を提供しています。マルチライン サーバー、TCP/UDP ネットワーク クライアント、MySQL、データベース接続池、AsyncTask、メッセージ列、秒タイマー、ファイル書き込み、DNS クエリ。強力な機能は、明確な分業を伴う複数のプロセスによって実現されます。ここでは、初心者が Swoole フレームワークをより早く理解できるように、いくつかのプロセスの分業について詳しく紹介します。


  • ブログ: http://www.cnblogs.com/jhzhu
  • メール: jhzhuustc@gmail.com
  • 著者: Zhimingso
  • 時間: 2015-08-17

ディレクトリ

  • [PHP]swoole_server プロセスの分業
    • ディレクトリ
    • Swoole の概要
      • Swoole: PHP の再定義
      • 関数デモ コード スニペット
        • TCP サーバー
        • TCP クライアント
    • メインプロセス分析
      • マスタープロセス
      • マネージャープロセス
      • ワーカープロセス
      • タスクプロセス
    • プロセスとイベントコールバックの対応
      • マスタープロセスのコールバック関数
      • ワーカープロセスのコールバック関数
      • タスクプロセス コールバック関数
      • Manager プロセスのコールバック関数

Swoole 紹介

Swoole 公式サイト

Swoole: PHP の再定義

Swoole: PHP 言語用の高性能ネットワーク通信フレームワーク。PHP 言語の非同期マルチスレッド サーバー、非同期 TCP/UDP ネットワーク クライアント、非同期 MySQL、データベース接続プールを提供します。 、AsyncTask、メッセージキュー、ミリ秒タイマー、非同期ファイルの読み書き、非同期DNSクエリ。 Swoole は標準的な PHP 拡張機能ですが、実は通常の拡張機能とは異なります。通常の拡張機能はライブラリ関数を提供するだけです。 swoole 拡張機能は、実行後に PHP の制御を引き継ぎ、イベント ループに入ります。 IO イベントが発生すると、swoole は指定された PHP 関数を自動的にコールバックします。

機能デモ コード スニペット

TCP サーバー

<span class="x">$serv = new swoole_server("127.0.0.1", 9501);</span><span class="x">$serv->set(array(</span><span class="x">    'worker_num' => 8,   //工作进程数量</span><span class="x">    'daemonize' => true, //是否作为守护进程</span><span class="x">));</span><span class="x">$serv->on('connect', function ($serv, $fd){</span><span class="x">    echo "Client:Connect.\n";</span><span class="x">});</span><span class="x">$serv->on('receive', function ($serv, $fd, $from_id, $data) {</span><span class="x">    $serv->send($fd, 'Swoole: '.$data);</span><span class="x">    $serv->close($fd);</span><span class="x">});</span><span class="x">$serv->on('close', function ($serv, $fd) {</span><span class="x">    echo "Client: Close.\n";</span><span class="x">});</span><span class="x">$serv->start();</span>
ログイン後にコピー

TCP クライアント

<span class="x">$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);</span><span class="x">//设置事件回调函数</span><span class="x">$client->on("connect", function($cli) {</span><span class="x">    $cli->send("hello world\n");</span><span class="x">});</span><span class="x">$client->on("receive", function($cli, $data){</span><span class="x">    echo "Received: ".$data."\n";</span><span class="x">});</span><span class="x">$client->on("error", function($cli){</span><span class="x">    echo "Connect failed\n";</span><span class="x">});</span><span class="x">$client->on("close", function($cli){</span><span class="x">    echo "Connection close\n";</span><span class="x">});</span><span class="x">//发起网络连接</span><span class="x">$client->connect('127.0.0.1', 9501, 0.5);</span>
ログイン後にコピー

その他のコード スニペットについては、swoole の公式 Web サイトをご覧ください。

メインプロセス分析

マスタープロセス

マスタープロセスは主に Swoole フレームワークメカニズムの動作を保証するために使用されます。これは、いくつかの機能スレッドを作成します。

  • リアクター スレッド: 実際に TCP 接続を処理し、データを送受信するスレッドです。新しい接続を受け入れた後、swoole のメイン スレッドはその接続を固定 Reactor スレッドに割り当て、このスレッドがソケットの監視を担当します。ソケットが読み取り可能なときにデータを読み取り、プロトコル分析を実行して、リクエストをワーカー プロセスに配信します。ソケットが書き込み可能なときに、TCP クライアントにデータを送信します。
  • マスター スレッド (メイン スレッド): 新しい接続の受け入れ、UNIX PROXI 信号処理、およびタイマー タスクを担当します。
  • ハートビートパケット検出スレッド:(省略)
  • UDPパケット受信スレッド:(省略)

マネージャープロセス

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

  • 子プロセスが終了すると、マネージャー プロセスは、ゾンビ プロセスになるのを避けるために子プロセスをリサイクルする責任があります。そして、新しいサブプロセスを作成します
  • サーバーがシャットダウンされると、マネージャープロセスはすべてのサブプロセスにシグナルを送信して、サブプロセスにサービスをシャットダウンするように通知します
  • サーバーがリロードされると、マネージャー プロセスはサブプロセスを 1 つずつシャットダウン/再起動します。

なぜマスター プロセスではないのですか? 主な理由は、マスター プロセスがマルチスレッドであるためです。フォーク操作を安全に実行できません。

ワーカープロセス

  • は Reactor スレッドによって配信されたリクエストパケットを受け入れ、PHP コールバック関数を実行してデータを処理します
  • は応答データを生成して送信しますReactor スレッドに送信され、Reactor スレッドによって TCP クライアントに送信されます
  • は、非同期非ブロッキング モードまたは同期ブロッキング モードにすることができます
  • ワーカーはマルチプロセス モードで実行されます

Swoole は、PHP の致命的なエラー、他のプログラムによって誤って強制終了された場合、または max_request 数に達した後に正常に終了した場合など、ワーカー プロセスが異常終了した場合に、完全なプロセス管理メカニズムを提供します。メインプロセスは新しいワーカープロセスを再起動します。通常のapache phpやphp-fpmと同様にワーカープロセス内でコードを記述することができます。 Node.js のような非同期コールバック コードを記述する必要はありません。

タスクプロセス

  • は、swoole_server->task/taskwait メソッドを通じてワーカープロセスによって配信されたタスクを受け取ります
  • はタスクを処理し、結果を返しますdata Worker プロセスの場合
  • 完全同期ブロッキングモードです
  • タスクはマルチプロセスで実行されます

タスクプロセスの正式名は task_worker プロセスです、これは特殊な種類のワーカー プロセスです。したがって、 onWorkerStart もタスクプロセス内で呼び出されます。 $worker_id >= $serv->setting['worker_num'] の場合はこのプロセスが task_worker であることを意味し、それ以外の場合はこのプロセスがワーカープロセスであることを意味します。

プロセスとイベントコールバックの対応

Master プロセスのコールバック関数

<span class="x">onStart</span><span class="x">onShutdown</span><span class="x">onMasterConnect</span><span class="x">onMasterClose</span><span class="x">onTimer</span>
ログイン後にコピー

Worker プロセスのコールバック関数

<span class="x">onWorkerStart</span><span class="x">onWorkerStop</span><span class="x">onConnect</span><span class="x">onClose</span><span class="x">onReceive</span><span class="x">onTimer</span><span class="x">onFinish</span>
ログイン後にコピー

Task プロセスのコールバック関数

<span class="x">onTask</span><span class="x">onWorkerStart</span>
ログイン後にコピー

Manager プロセスのコールバック関数

<span class="x">onManagerStart</span><span class="x">onManagerStop</span>
ログイン後にコピー
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート