ホームページ  >  記事  >  バックエンド開発  >  (PHP7カーネル解析-1) CGIとFastCGI

(PHP7カーネル解析-1) CGIとFastCGI

不言
不言オリジナル
2018-04-03 16:06:511379ブラウズ
CGI: Web サーバーと Web アプリケーションの間でデータを交換するためのプロトコルです。
FastCGI: CGI と同じ通信プロトコルですが、CGI よりも効率が最適化されています。
PHP-CGI: Webサーバーが提供するCGIプロトコルに対するPHP(Webアプリケーション)のインターフェースプログラムです。
PHP-FPM: PHP (Web アプリケーション) によって Web サーバーに提供される FastCGI プロトコルのインターフェイス プログラムです。また、クライアントの場合、比較的インテリジェントなタスク管理

CGI ワークフローも提供します。 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 の実装では、マスター プロセスを作成し、マスター プロセス内にワーカー プールを作成してソケットをリッスンさせ、複数の子プロセスをフォークアウトします。 (work) これらの子プロセスは、それぞれの受け入れリクエストの処理は非常に単純で、リクエストが到着すると、リクエストデータの読み取りを開始し、処理を開始します。この期間中は他のリクエストを受信しません。つまり、PHP-FPM のサブプロセスは、このリクエストが処理された後でのみ応答できます。受け入れられます

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

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

(PHP7カーネル解析-1) CGIとFastCGIワーカー ワークフロー

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 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 シグナルを送信します。この設定の単位は秒です。これは、このメカニズムをオフにすることを意味します。 .fpm_pctl_on_socket_accept(): オンデマンド モードのマスターによって監視される新しいリクエストの到着イベント。オンデマンド モードでは、fpm は開始時にワーカーを事前に作成しないため、子プロセスはリクエストがあった場合にのみ生成されます。したがって、リクエストが到着したときにマスタープロセスに通知する必要があります

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。