CGI の正式名は「Common Gateway Interface」で、クライアントが Web ブラウザから Web サーバー上で実行されているプログラムにデータを要求できるようになります。 CGI は、クライアントとプログラムの間でデータを転送するための標準を記述します。 CGI の目的の 1 つは、どの言語にも依存しないことであるため、言語に標準の入力、出力、および環境変数がある限り、CGI はどの言語でも作成できます。 php、perl、tclなど。
FastCGIは、Webサーバーとハンドラーの間の通信のためのプロトコルです。FastCGIは、常に実行でき、リクエストが到着したときに変更されません。プロセスをフォークして処理するには時間がかかります (これは、CGI のフォークして実行する最も批判的なモードです)。 これは単なる通信プロトコルであるため、分散コンピューティングもサポートしています。つまり、FastCGI プログラムは Web サイト サーバー以外のホストで実行でき、他の Web サイト サーバーからのリクエストを受け入れることができます。
FastCGI は、より高いパフォーマンスを得るために CGI インタープリター プロセスをメモリ内に保持する、言語に依存しないスケーラブルなアーキテクチャ CGI オープン拡張機能です。 CGI プログラムの繰り返しロードが CGI パフォーマンス低下の主な原因です。CGI プログラムがメモリ内に保持され、FastCGI プロセス マネージャーによるスケジュールが受け入れられる場合、良好なパフォーマンス、スケーラビリティ、フェイルオーバー機能などが提供されます。
通常、FastCGI のワークフロー全体は次のようになります:
Web サーバーの起動時に FastCGI プロセス マネージャー (IIS ISAPI または Apache モジュール) がロードされます
FastCGI プロセス マネージャーはそれ自体を初期化し、複数の CGI インタープリター プロセス (複数の PHP) を開始します-cgivisible) を指定し、Web サーバーからの接続を待ちます。
クライアントリクエストがWebサーバーに到達すると、FastCGIプロセスマネージャーがCGIインタープリターを選択して接続します。 Web サーバーは、CGI 環境変数と標準入力を FastCGI サブプロセス php-cgi に送信します。
FastCGI サブプロセスは処理が完了すると、同じ接続から Web サーバーに標準出力とエラー情報を返します。 FastCGI 子プロセスが接続を閉じると、リクエストが処理されます。次に、FastCGI 子プロセスは、(Web サーバーで実行されている) FastCGI プロセス マネージャーからの次の接続を待機して処理します。 CGI モードでは、php-cgi はこの時点で終了します。
PHPのCGIは、Webサーバーからのリクエストを受け付けるTCPまたはUDPプロトコルサーバーであるFastcgiプロトコルを実装しており、起動するとTCP/UDPプロトコルサーバーのソケットモニターを作成し、関連するリクエストを受信して処理します。次に、PHP のライフ サイクルに入ります。モジュールの初期化、sapi の初期化、PHP リクエストの処理、モジュールの終了、sapi の終了などが CGI のライフ サイクル全体を構成します。
TCP サーバー側では、一般に次の手順が実行されます:
socket 関数を呼び出して、TCP のストリーミング ソケットを作成します。
サーバーのローカル アドレスを比較します。前のソケット 作成されたソケット バインディング
新しく作成されたソケットをリスナーとして使用するために listen 関数を呼び出し、クライアントによって開始された接続を待機します。クライアントがこのソケットに接続されている複数の接続がある場合は、キューに入れる必要がある場合があります。処理;
サーバープロセスは accept 関数を呼び出し、クライアントプロセスが connect 関数を呼び出して接続を確立するまでブロック状態になります。
クライアントとの接続が確立されると、サーバーは read_stream 関数を呼び出してクライアントのrequest;
データを処理した後、サーバーは書き込み関数を呼び出してクライアントに応答を送信します。
PHP 用 FastCGI を使用すると、すべての PHP アプリケーションが mod_phpsussexec ではなく mod_fastci を通じて実行されます。 FastCGI アプリケーションは耐久性と安定性があり、リクエストごとに起動して初期化する必要がないため、高速です。これにより、CGI パラダイムでは現実的ではないアプリケーション (大規模なスクリプトや、単一または複数のデータベースへの接続を必要とするアプリケーションなど) の開発が可能になります。
FastCGI の利点:
PHP スクリプトの実行速度が速くなります (3 ~ 30 倍)。 PHP インタープリターは、必要になるたびにメモリーから読み取られるのではなく、メモリーにロードされるため、スクリプトに依存するサイトのパフォーマンスが大幅に向上します。
必要なシステムリソースが少なくなります。サーバーは必要になるたびに PHP インタープリターをロードする必要がないため、CPU の負荷を増やすことなくサイトの送信速度を大幅に向上させることができます。
既存のコードを変更する必要はありません。世の中にあるものはすべて PHP の FastCGI で動作します。
しかし、潜在的な問題もあります:
すべてのサブディレクトリに対して利用可能な php.ini ファイルは 1 つだけです (/home/USERNAME/public_html/php.ini)。これは、Web サイトのコードを最適化するために必要です。さまざまなスクリプト作成のニーズに対応するために複数の php.ini ファイルが必要な場合は、任意のサブディレクトリで PHP の高速 CGI を無効にし、他の場所ではアクティブなままにしておくことができます。これを行う必要がある場合は、サポートにお問い合わせください。
PHP 環境に行うアップグレード (php.ini ファイルへの変更など) には数分の遅延が発生します。これは、php.ini ファイルが、必要になるたびにメモリから再読み取られるのではなく、高速化のためにメモリにロードされるためです。