ホームページ  >  記事  >  バックエンド開発  >  CGI および FastCGI の PHP7 カーネル解析

CGI および FastCGI の PHP7 カーネル解析

藏色散人
藏色散人転載
2019-04-02 10:52:372548ブラウズ

CGI: Web サーバーと Web アプリケーションの間でデータを交換するためのプロトコルです。

FastCGI: CGI と同じ通信プロトコルですが、CGI よりも効率が最適化されています。

PHP-CGI: Webサーバーが提供するCGIプロトコルに対するPHP(Webアプリケーション)のインターフェースプログラムです。

PHP-FPM: PHP (Web アプリケーション) が Web サーバーに提供する FastCGI プロトコルのインターフェース プログラムであり、比較的インテリジェントなタスク管理も提供します。

CGI ワークフロー

#1. クライアントが Index.html をリクエストすると、Web サーバーはファイル システム内でこのファイルを見つけてブラウザに送信します。静的データです。

2. Web サーバーは、index.php リクエストを受信すると、対応する CGI プログラム (PHP パーサー) を開始します。次に、PHP パーサーは php.ini ファイルを解析し、実行環境を初期化してリクエストを処理し、処理結果を CGI で指定された形式で返し、プロセスを終了し、Web サーバーは結果をブラウザに返します。

FastCGI ワークフロー

1. クライアントが Index.html をリクエストすると、Web サーバーはファイル システム内でこのファイルを見つけてブラウザに送信します。ここで配布されているのは静的データです。

2. Web サーバーがindex.php リクエストを受信すると、FastCGI プログラム (FastCGI は起動時に実行環境を初期化し、各 CGI プロセス プールは実行環境を共有します) が CGI プロセス プール内に存在します。 CGI プロセスはリクエストを処理し、処理結果を CGI で指定された形式で返し、次のリクエストを待ち続けます。

PHP-FPM の基本的な実装

1. PHP-FPM の実装では、マスター プロセスを作成し、マスター プロセス内にワーカー プールを作成し、それを実行します。ソケットをリッスンし、複数のサブプロセスをフォーク (作業) し、これらの各サブプロセスがリクエストを受け入れます。サブプロセスの処理は非常に単純です。起動後の受け入れでブロックされます。リクエストが到着すると、リクエストデータの読み取りを開始します。読み取りが完了すると、処理が開始され、リターンします。この間、他のリクエストは受信されません。つまり、PHP-FPM のサブプロセスは、時点で 1 つのリクエストのみに応答できます。

2. PHP-FPM マスター プロセスとワーカー プロセスの間には直接通信はありません。マスターはワーカー プロセスの情報を取得します。ワーカー プロセスの現在のステータス、処理されたリクエストの数など、共有メモリを介して情報を取得します。マスター プロセスがワーカー プロセスを強制終了したい場合は、シグナルを送信してワーカー プロセスに通知します。

3.PHP-FPM は複数のポートを同時に監視できます。各ポートはワーカー プールに対応し、各プールは複数のワーカー プロセスに対応します。

CGI および FastCGI の PHP7 カーネル解析

#ワーカー ワークフロー #1. リクエストを待機中: ワーカー プロセスは fcgi_accept_request() でブロックされ、リクエストを待機しています;

2. リクエストの解析: fastcgi リクエストが到着すると、ワーカーがそれを受け取ります。その後、リクエスト データが完全に到着するまで、リクエスト データの受信と解析を開始します。

3. リクエストの初期化: php_request_startup() を実行します。この段階で各拡張機能が呼び出されます。 PHP_RINIT_FUNCTION();

4 . コンパイルと実行: PHP スクリプトのコンパイルと実行は、php_execute_script();

5 によって完了します。リクエストを閉じる: リクエストが完了したら、php_request_shutdown( ). この段階で、各拡張機能は次のように呼び出されます: PHP_RSHUTDOWN_FUNCTION() その後、ステップ (1) に入り、次のリクエストを待ちます。

マスター プロセス管理

1.static: このメソッドは比較的単純で、起動時に、マスターは pm.max_children に従って対応する数のワーカー プロセスをフォークアウトします。構成、つまりワーカー プロセスの数は固定です

2.dynamic: 動的プロセス管理では、fpm の開始時に、まず pm.start_servers に従って一定数のワーカーを初期化します。アイドル状態のワーカーの数が pm.min_spare_servers 構成数より小さい場合 (リクエストが多すぎてワーカーが処理できないことを示します)、ワーカー プロセスはフォークされますが、ワーカーの総数は pm.max_children を超えることはできません。マスターは、アイドル状態のワーカーの数が pm.max_spare_servers を超えていることを検出します (アイドル状態のワーカーが多すぎることを示します) は、リソースの占有を避けるために一部のワーカーを強制終了します。マスターはこれら 4 つの値を使用して数を制御しますワーカーの数

3.ondemand: このメソッドは通常、ほとんど使用されず、起動時にワーカー プロセスを割り当てません。リクエストがあるまで待ってから、マスター プロセスにワーカー プロセスをフォークするように通知します。ワーカーの総数pm.max_children を超えません。ワーカー プロセスは、処理完了後すぐに終了しません。アイドル時間が pm.process_idle_timeout

## を超えると終了します。##PHP-FPM Event Manager

1.sp[1] パイプライン読み取り可能イベント: このイベントはマスターによって信号を処理するために使用されます2.fpm_pctl_perform_idle_server_maintenance_heartbeat(): これはプロセス管理の実装におけるメイン イベントです。 1 秒ごとにトリガーされるタイマーを開始します。主にダイナミック モードおよびオンデマンド モードでのワーカー管理に使用されます。マスターは各ワーカー プール内のワーカー プロセスの数を定期的にチェックし、このタイマーを通じて実装します。ワーカー数の制御

3.fpm_pctl_heartbeat(): このイベントは、ワーカーが 1 つのリクエストを処理するのにかかる最大時間を制限するために使用されます。php-fpm.conf には request_terminate_timeout 設定項目があります。リクエストを処理するワーカーがこの値を超えると、マスターはワーカー プロセスを強制終了するために kill -TERM シグナルをワーカー プロセスに送信します。この構成の単位は秒です。デフォルト値は 0 で、このメカニズムをオフにすることを意味します。

4.fpm_pctl_on_socket_accept(): オンデマンド モードでマスターによって監視される新しい値。オンデマンド モードでは、fpm は開始時にワーカーを事前に作成せず、子プロセスがリクエストがあった場合にのみ生成されるため、リクエストが到着したときにマスタープロセスに通知する必要があります

以上がCGI および FastCGI の PHP7 カーネル解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。