ホームページ  >  記事  >  バックエンド開発  >  CGI、FastCGI、PHP-FPM の関係図

CGI、FastCGI、PHP-FPM の関係図

不言
不言オリジナル
2018-04-16 13:55:1415498ブラウズ

この記事は主にCGI、FastCGI、PHP-FPMの関係図を紹介していますので、必要な方はぜひ参考にしてください


。基本

  • モジュールメソッド

  • CGI

  • FastCGIの概要

  • FastCGIの簡単な紹介

    • FastCGIの仕組み

    • PHP-FPM の概要

  • 概要

  • 参考資料

  • LAMP/LNMP サーバーを構築するとき、PHP-FPM、FastCGI、および CGI の概念によく遭遇します。これらについて少しでも知っていれば、高性能なサーバーを構築するのは難しくなります。次に、これらの概念の関係を図で説明します。

    基本
Web サイトのアーキテクチャ全体において、Web サーバー (Apache など) はコンテンツのディストリビュータにすぎません。たとえば、クライアントがindex.htmlをリクエストすると、Webサーバーはファイルシステム内でこのファイルを見つけてブラウザに送信します。ここで配布されるのは静的データです。

構成ファイルによると、リクエストがindex.phpの場合、Webサーバーはこれが静的ファイルではなく、PHPパーサーによって処理される必要があることを認識しているため、単純にリクエストを処理してから、それを PHP パーサーに渡します。

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

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

  • FastCGI:

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

  • PHP-CGI:

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

  • PHP-FPM:

    は、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 の関係について詳しく説明するために別の図を見てみましょう:

CGI、FastCGI、PHP-FPM の関係図

上の図から、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

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 の概要

FastCGI の簡単な紹介

基本的に言えば、FastCGI は CGI プログラムのパフォーマンスを向上させるために使用されます。 CGI と同様に、FastCGI もプロトコルであると言えます。

FastCGI は、長寿命 CGI のようなもので、起動している限り、毎回 fork する手間がかかりません。また、分散コンピューティングもサポートしています。つまり、FastCGI プログラムを Web サイト サーバー以外のホストで実行し、他の Web サイト サーバーからのリクエストを受け入れることができます。

FastCGI は、言語に依存しないスケーラブルなアーキテクチャの CGI オープン拡張機能であり、その主な動作は CGI インタープリター プロセスをメモリ内に保持し、より高いパフォーマンスを実現することです。ご存知のとおり、CGI インタープリタの繰り返しロードが CGI パフォーマンス低下の主な原因です。CGI インタープリタがメモリ内に残り、FastCGI プロセス マネージャーのスケジューリングを受け入れる場合、良好なパフォーマンス、スケーラビリティ、フェイルオーバー機能などが提供されます。

FastCGI の仕組み

FastCGI インターフェイス メソッドは C/S 構造を採用しており、HTTP サーバーとスクリプト解析サーバーを分離し、スクリプト解析サーバー上で 1 つ以上のスクリプト解析デーモンを同時に起動できます。 HTTP サーバーが動的プログラムに遭遇するたびに、そのプログラムは実行のために FastCGI プロセスに直接配信され、その結果がブラウザーに返されます。この方法により、HTTP サーバーは静的リクエストを排他的に処理したり、動的スクリプト サーバーの結果をクライアントに返すことができるようになり、アプリケーション システム全体のパフォーマンスが大幅に向上します。

CGI、FastCGI、PHP-FPM の関係図

  1. Webサーバーの起動時にFastCGIプロセスマネージャー(ApacheモジュールやIIS ISAPIなど)をロードします

  2. FastCGIプロセスマネージャーはそれ自体を初期化し、複数のCGIインタープリタープロセスを開始します(複数のphpを構築できます) )cgi) を実行し、Web サーバーからの接続を待ちます。

  3. クライアントリクエストがWebサーバーに到達すると、FastCGIプロセスマネージャーがCGIインタープリターを選択して接続します。 Web サーバーは、CGI 環境変数と標準入力を FastCGI サブプロセス php-cgi に送信します。

  4. FastCGI サブプロセスは処理が完了すると、同じ接続から Web サーバーに標準出力とエラー情報を返します。 FastCGI 子プロセスが接続を閉じると、リクエストが処理されます。次に、FastCGI 子プロセスは待機し、(Web サーバーで実行されている) FastCGI プロセス マネージャーからの次の接続を処理します。 CGI モードでは、php-cgi はこの時点で終了します。

FastCGI と CGI の機能:

  1. CGI の場合、すべての Web リクエスト PHP は php.ini を再解析し、すべての拡張機能を再ロードし、すべてのデータ構造を再初期化する必要があります。 FastCGI では、これらすべてがプロセスの開始時に 1 回だけ行われます。さらに、永続的なデータベース接続が機能するという利点もあります。

  2. FastCGI はマルチプロセスであるため、CGI マルチスレッドよりも多くのサーバー メモリを消費します。大量のメモリを取得するには、php-cgi インタープリタはプロセスごとに 7 ~ 25 メガバイトのメモリを消費します。メモリ。 。

PHP-FPM の紹介

PHP-FPM を理解するには、まず PHP-CGI について話す必要があります。

PHP-CGI は、PHP によって実装された組み込みの FastCGI マネージャーです。 PHP の公式製品ではありますが、まったく強力ではなく、パフォーマンスも非常に低く、非常に面倒で非人間的です。これは主に次の点に反映されています。

  1. php-cgi php.ini を変更した後。設定を変更するには、php を再起動する必要があります。新しい php-ini を有効にできるのは cgi だけであり、スムーズに再起動することはできません。

  2. php-cgiプロセスを直接強制終了すると、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

関連推奨事項:

PHP7 カーネル分析 1 CGI と FastCGI

CGI、FastCGI、および PHP_FPM の関係は何ですか?

以上がCGI、FastCGI、PHP-FPM の関係図の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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