この記事は主にCGI、FastCGI、PHP-FPMの関係図を紹介していますので、必要な方はぜひ参考にしてください
FastCGIの簡単な紹介
PHP-FPM の概要
構成ファイルによると、リクエストがindex.phpの場合、Webサーバーはこれが静的ファイルではなく、PHPパーサーによって処理される必要があることを認識しているため、単純にリクエストを処理してから、それを PHP パーサーに渡します。
Web サーバーは、index.php リクエストを受信すると、対応する CGI プログラム (PHP パーサー) を開始します。次に、PHP パーサーは php.ini ファイルを解析し、実行環境を初期化してリクエストを処理し、処理結果を CGI で指定された形式で返し、プロセスを終了し、Web サーバーは結果をブラウザに返します。これは完全な動的 PHP Web アクセス プロセスです。次にこれらの概念を紹介すると、より理解しやすくなります。
は、Web サーバーと Web アプリケーション間のデータ交換のためのプロトコルです。
CGI と同じ通信プロトコルですが、CGI よりも効率が最適化されています。同様に、SCGI プロトコルは FastCGI に似ています。
は、Webサーバーが提供するCGIプロトコルに対するPHP(Webアプリケーション)のインターフェースプログラムです。
は、PHP (Web アプリケーション) によって Web サーバーに提供される FastCGI プロトコルのインターフェイス プログラムです。また、比較的インテリジェントなタスク管理も提供します。
WEBでは、
Webサーバーは通常、Apache、Nginx、IIS、Lighttpd、Tomcatおよびその他のサーバーを指し、
Webアプリケーションは通常、PHP、Java、Asp.netおよびその他のアプリケーションを指します。
CGIを理解する前に、まずWebサーバーがデータを転送するための別のメソッド、PHPモジュールロードメソッドを理解しましょう。 Apache を例に挙げます。PHP モジュール モードでは、Apache の設定ファイル httpd.conf に次の文を追加します。
# 加入以下2句LoadModule php5_module D:/php/php5apache2_2.dllAddType application/x-httpd-php .php# 修改如下内容<IfModule dir_module> DirectoryIndex index.php index.html</IfModule>
上記は、Windows に php と Apache 環境をインストールした後の手動設定です。 Linux でのソース コードのインストールは次のとおりです。大まかに次のように構成されています:
# ./configure --with-mysql=/usr/local --with-apache=/usr/local/apache --enable-track-vars
したがって、このように、共通の本質は、LoadModuleを使用してphp5_moduleをロードすること、つまり、phpをApacheのサブモジュールとして実行することです。 Web 経由で php ファイルにアクセスすると、Apache は php5_module を呼び出して php コードを解析します。
では、php5_module はどのようにして php パーサーにデータを渡し、php コードを解析するのでしょうか?答えはサピを通じてです。
Apache、php、sapi の関係について詳しく説明するために別の図を見てみましょう:
上の図から、sapi がそのような中間プロセスであり、SAPI が外部通信を提供していることがわかります。これはソケットに似ており、PHP が他のアプリケーション (Apache、nginx など) と対話できるようにします。 PHP はデフォルトで多くの種類の SAPI を提供します。一般的なものは、php5_module、CGI、Apache および nginx 用の FastCGI、IIS 用の ISAPI、および Shell CLI です。
ということで、上記のApache呼び出しphpの実行プロセスは以下の通りです:
apache -> httpd -> php5_module -> sapi -> php
わかりました。 php5_module を通して Apache と php を理解しましょう!
このモードはphpモジュールをApacheにインストールするため、Apacheがリクエストを終了するたびにプロセスが生成され、このプロセスにはphpのさまざまな計算や演算が完全に含まれます。
上の図では、Apache がリクエストを受け取るたびに、SAPI を介してリクエストを完了するために php に接続するプロセスを生成していることがはっきりとわかります。ユーザー数が多すぎて同時実行数が多すぎると、サーバーはそれに耐えられなくなります。
また、mod_phpをApacheにコンパイルすると、問題が発生した際にphpの問題なのかApacheの問題なのかを判断することが困難になります。
CGI (Common Gateway Interface) は、「Common Gateway Interface」の略で、WEBサーバーがPHPアプリケーションと「対話」するためのツールであり、そのプログラムはネットワークサーバー上で実行する必要があります。 。 CGI は、標準入力、出力、および環境変数を備えている言語であれば、どの言語でも作成できます。 php、perl、tclなど。
WEB サーバーはどのようなデータを PHP パーサーに渡しますか? URL、クエリ文字列、POSTデータ、HTTPヘッダーはすべてそこにあります。したがって、CGI は、どのようなデータが送信され、どのような形式でリクエストを処理するためにバックエンドに渡されるかを規定するプロトコルです。 PHP コードで使用するユーザーがどこから来たのかを慎重に考えてください。
言い換えれば、CGI は Web サーバーを処理するために特別に使用されます。 Web サーバーはユーザーのリクエストを受信すると、そのリクエストを CGI プログラム (php-cgi など) に送信し、CGI プログラムはリクエストで送信されたパラメーターに従って処理 (php を解析) し、標準の HTML を出力します。ステートメントを作成し、Web サーバーに返します。これが通常の CGI の動作です。
CGI の利点は、どのサーバーからも完全に独立しており、仲介者としてのみ機能することです。 Apache と php へのインターフェイスを提供します。 CGI 配線を通じてデータ転送を完了します。この利点は、2 つの間の関連性を最小限に抑え、より独立したものにすることです。
しかし、CGI には厄介な点があります。つまり、すべての Web リクエストには起動プロセスと終了プロセスがあり、これは最も批判されている fork-and-execute モードですが、大規模な同時実行では、このようになります。死んでいる。
基本的に言えば、FastCGI は CGI プログラムのパフォーマンスを向上させるために使用されます。 CGI と同様に、FastCGI もプロトコルであると言えます。
FastCGI は、長寿命 CGI のようなもので、起動している限り、毎回 fork する手間がかかりません。また、分散コンピューティングもサポートしています。つまり、FastCGI プログラムを Web サイト サーバー以外のホストで実行し、他の Web サイト サーバーからのリクエストを受け入れることができます。
FastCGI は、言語に依存しないスケーラブルなアーキテクチャの CGI オープン拡張機能であり、その主な動作は CGI インタープリター プロセスをメモリ内に保持し、より高いパフォーマンスを実現することです。ご存知のとおり、CGI インタープリタの繰り返しロードが CGI パフォーマンス低下の主な原因です。CGI インタープリタがメモリ内に残り、FastCGI プロセス マネージャーのスケジューリングを受け入れる場合、良好なパフォーマンス、スケーラビリティ、フェイルオーバー機能などが提供されます。
FastCGI インターフェイス メソッドは C/S 構造を採用しており、HTTP サーバーとスクリプト解析サーバーを分離し、スクリプト解析サーバー上で 1 つ以上のスクリプト解析デーモンを同時に起動できます。 HTTP サーバーが動的プログラムに遭遇するたびに、そのプログラムは実行のために FastCGI プロセスに直接配信され、その結果がブラウザーに返されます。この方法により、HTTP サーバーは静的リクエストを排他的に処理したり、動的スクリプト サーバーの結果をクライアントに返すことができるようになり、アプリケーション システム全体のパフォーマンスが大幅に向上します。
PHP-CGI は、PHP によって実装された組み込みの FastCGI マネージャーです。 PHP の公式製品ではありますが、まったく強力ではなく、パフォーマンスも非常に低く、非常に面倒で非人間的です。これは主に次の点に反映されています。
上記の 2 つの問題は長い間多くの人を悩ませてきたため、多くの人が今でもモジュール方式を使用しています。 Andrei Nigmatulin という名の敗者がこの状況を完全に打破したのは 2004 年のことです。これは、上記の 2 つの問題を簡単に克服し、さらに強力であることを示しました。他の面でのパフォーマンス。
言い換えると、PHP-FPM は FastCGI プロトコルの特定の実装であり、Web サーバーからのリクエストを処理するプロセス プールを管理します。 現在、PHP5.3バージョン以降では、PHPにPHP-FPMが組み込まれています。
PHP-CGIは単なるCGIプログラムであるため、リクエストを解析して結果を返すことしかできず、プロセス管理については知りません。そのため、lighthttpd から分離された spawn-fcgi など、php-cgi プロセスをスケジュールできるプログラムがいくつか存在します。同様に、PHP-FPM も、PHP パーサー php-cgi のスケジュールと管理に使用される管理プログラムです。
PHP-FPM は、新しいサブプロセスを生成することで、php.ini 変更後のスムーズな再起動を実現できます。
最後に、これらのテクノロジーが継続的なアップグレード後にどのような問題を解決できるかをまとめてみましょう (そうしないとアップグレードされないでしょう)。
したがって、高性能の PHP WEB サーバーを構築したい場合、現時点での最良の方法は、Apache/Nginx + FastCGI + PHP-FPM(+PHP-CGI) です。 メソッド、モジュールの読み込みや CGI メソッドはもう使用しないでください:)
この記事の写真は Visio で作成されました、ソース ファイル: php-fpm
元のアドレス: https://www.awaimai.com/ 371.html
関連推奨事項:
CGI、FastCGI、および PHP_FPM の関係は何ですか?
以上がCGI、FastCGI、PHP-FPM の関係図の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。