この記事の内容は、PHP7 カーネル解析 1 の CGI と FastCGI についてです。必要な友達は参考にしてください。
CGI: Web サーバーと Web アプリケーションの間でデータを交換するためのプロトコルです。
FastCGI: CGI と同じ通信プロトコルですが、CGI よりも効率が最適化されています。
PHP-CGI: Webサーバーが提供するCGIプロトコルに対するPHP(Webアプリケーション)のインターフェースプログラムです。
PHP-FPM: PHP (Web アプリケーション) によって Web サーバーに提供される、比較的インテリジェントなタスク管理
CGI ワークフロー
1 のインターフェイス プログラムです。そうすると、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 の実装では、マスター プロセスを作成し、マスター プロセス内にワーカー プールを作成してソケットをリッスンさせ、複数の子プロセスをフォークアウトします。 (work) これらの子プロセスは、それぞれの受け入れリクエストの処理は非常に単純で、リクエストが到着すると、リクエストデータの読み取りを開始し、処理を開始します。この期間中は他のリクエストを受信しません。つまり、PHP-FPM のサブプロセスは、このリクエストが処理された後でのみ応答できます。受け入れられます
2. PHP-FPM のマスタープロセスとワーカープロセスの間には直接通信はなく、マスターはワーカープロセスの現在のステータスなどの情報を共有メモリを通じて取得します。処理されたリクエストの数など。マスタープロセスがワーカープロセスを強制終了したい場合、シグナルを送信してワーカープロセスに通知します。
3.PHP-FPM は複数のポートを同時に監視できます。各ポートはワーカー プールに対応し、各プールは複数のワーカー プロセスに対応します
ワーカー ワークフロー
1。 : ワーカー プロセスは、リクエストを待機している fcgi_accept_request() でブロックされます。2. リクエストを解析します。fastcgi リクエストが到着すると、リクエスト データが完全に受信されるまで、リクエスト データの受信と解析が開始されます。到着;
3. リクエストの初期化: php_request_startup() を実行します。この段階では、PHP_RINIT_FUNCTION() が呼び出されます。
4. PHP スクリプトのコンパイルと実行は、php_execute_script() によって完了します。 : リクエストが完了すると、各拡張機能に対して php_request_shutdown() が呼び出されます: PHP_RSHUTDOWN_FUNCTION()、ステップ (1) に入り、次のリクエストを待ちます。
1.static: このメソッドは起動時に、pm.max_children 設定に従って対応する数のワーカープロセスをフォークアウトします。つまり、ワーカープロセスの数は固定されています。
2.dynamic : 動的プロセス管理。fpm の開始時に、マスターがアイドル状態のワーカーの数が構成された pm.min_spare_servers の数より少ないことを検出した場合、最初に pm.start_servers に従って特定の数のワーカーを初期化します。リクエストが多すぎてワーカーが処理できないことを示します)、ワーカー プロセスはフォークされますが、アイドル状態のワーカーの数が pm.max_spare_servers を超えていることがマスターによって検出された場合、ワーカーの合計数は pm.max_children を超えることはできません。アイドル状態のワーカーが多すぎる場合)、リソースの占有を避けるために一部のワーカーが強制終了されます。マスターはこれらの 4 つの値を使用してワーカーの数を制御します
3.ondemand: このメソッドは通常、ほとんど使用されません。ワーカー プロセスは起動時に割り当てられません。ワーカー プロセスの合計数が pm を超えない場合、マスター プロセスはワーカー プロセスをフォークするように通知されます。ワーカー プロセスは、処理が完了してもすぐには終了しません。アイドル時間が pm.process_idle_timeout を超えると終了します
PHP-FPM Event Manager1.sp[1] パイプライン読み取り可能イベント: このイベントは信号処理のマスター
2.fpm_pctl_perform_idle_server_maintenance_heartbeat(): これはプロセス管理実装のメイン イベント。マスターは 1 秒ごとにトリガーされるタイマーを開始します。これは主に動的モードおよびオンデマンド モードでのワーカー管理に使用され、各ワーカー プール内のワーカー プロセスの数を確認し、数を制御します。このタイマーを通過した労働者の数
3.fpm_pctl_heartbeat(): このイベントは、ワーカーが 1 つのリクエストを処理するのにかかる最大時間を制限するために使用されます。php-fpm.conf には request_terminate_timeout 設定項目があります。リクエストがこの値を超えると、マスターはこのワーカー プロセスを強制終了するために kill -TERM シグナルを送信します。この設定の単位は秒です。これは、このメカニズムをオフにすることを意味します。 .fpm_pctl_on_socket_accept(): オンデマンド モードのマスターによって監視される新しいリクエストの到着イベント。オンデマンド モードでは、fpm は開始時にワーカーを事前に作成しないため、子プロセスはリクエストがあった場合にのみ生成されます。したがって、リクエストが到着したときにマスタープロセスに通知する必要があります
以上がPHP7 カーネル解析 1 CGI および FastCGIの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。