CGI,FastCGIとPHP


CGI
CGICGI(Common Gateway Interface)とは、サーバがコマンドラインインタフェースプログラムのようにサードパーティプログラムを実行できるように、Webサーバに標準的なプロトコルを提供し、サードパーティプログラムがWebページ面を動的に生成できるようにする標準的なプロトコルです.これらのサードパーティ製プログラムは、CGIスクリプト(CGI定義を満たすプログラム)またはCGIsと略称される.これらのCGIプログラムがどのように実行されるかはサーバによって決まる.一般に、CGIスクリプトは、Webリクエストを受信すると、HTMLを動的に生成することができる.
なぜCGIがあるのかブラウザが要求情報をwebサーバに送信するように、webサーバはCGIプログラムが必要なときにも必要な情報をCGIプログラムに渡す.したがって、CGIプログラムの実行が完了すると、http対応のコンテンツ、例えば、現在のリクエストの応答状態、返されるコンテンツタイプ(e.g.HTML、PDF、or plain text)など、Webサーバにいくつかの情報を返す必要があります.
以前は、異なるウェブサーバが異なる方法でCGIプログラムと情報を交換していたため、CGIプログラムの汎用性が強くなかった(異なるウェブサーバによってCGIプログラムを変更する必要がある).そのためCGIが誕生し,webサーバとCGIプログラム間の情報交流を規範化するためのいくつかの一般的な方法を定義した.初期のCGIプログラムは主にHTMLフォームの処理に用いられた.
WebserverとCGIプログラムの接続は、WebサーバでどのurlがCGIプログラムによって処理される必要があるかを構成することが多い.これは通常、サーバの一部のディレクトリがCGIプログラムに属することを規定することによって行われる(このディレクトリは、例えば「http://example.com/cgi-bin/pr...」このurlはcgi-binというディレクトリに対応しているので、サーバはこのリクエストがCGIプログラムによって処理される必要があることを知っています)
Webサーバは必要な情報を環境変数に格納し,CGIプログラムは環境変数から必要な情報を取得するので,両者間の情報交換を実現できる.CGIプログラムの処理が完了すると,「標準出力」に送信された情報がwebサーバに転送され,サーバはその結果をクライアントに返す.
以下のパラメータの多くはCGI規格で規定されており、WebサーバからCGIプログラムに渡す必要がある(前述の「環境変数」方式).
Server specific variables:
    SERVER_SOFTWARE: HTTP     name/version
    SERVER_NAME:        (    IP  )
    GATEWAY_INTERFACE: CGI/version.
Request specific variables:
    SERVER_PROTOCOL: HTTP/version.
    SERVER_PORT: TCP   .
    REQUEST_METHOD: HTTP    (GET,POST ).
    PATH_INFO:     
    PATH_TRANSLATED:   PATH_INFO    ,                  。
    SCRIPT_NAME:          (  /cgi-bin/script.cgi)
    QUERY_STRING: URL “?”         。       (query string)   “name=value”     (  var1=val1&var2=val2...)
    REMOTE_HOST:        
    REMOTE_ADDR:     ip  。
    AUTH_TYPE:     (      )
    REMOTE_USER : AUTH_TYPE  
    REMOTE_IDENT: see ident, only if server performed such lookup.
    CONTENT_TYPE: Internet media type of input data if PUT or POST method are used, as provided via HTTP header.
    CONTENT_LENGTH: similarly, size of input data (decimal, in octets) if provided via HTTP header.
       user agent     (       ) :HTTP_ACCEPT, HTTP_ACCEPT_LANGUAGE, HTTP_USER_AGENT, HTTP_COOKIE

CGIの欠点は、要求ごとにCGIプログラムを起動することであり、1回の要求処理に対して起動プロセスの性能消費がプロセス全体の消費割合に占める割合は小さくないため、要求ごとに新しいCGIプログラムを起動して処理する必要がある場合、明らかに性能的に非効率である.
CGIの代替案は、上述したCGIの欠点のため、以下の代替案が現れた.
  • fastCGI(「prefork」プリジェネレーション);
  • はモジュール化され、webサーバで対応するプログラムを直接実行してhtml(例えばapacheのmod_php)を動的に生成する.
  • プリコンパイルされたCGIプログラム(すなわちコンパイル言語)を使用する.
  • Javaのservlet
  • FastCGI & php-fpm
    FastCGIFastCGIとは、CGI標準プロトコル上で開発された変種プロトコルであり、主な目標は、WebサーバとCGIプログラムとの相互作用時の負荷を軽減することであり、1台のサーバが同じ時間により多くのWebリクエストを処理できるようにすることである.
    FastCGIの実装の詳細は、CGIが要求を処理するたびに新しいCGIプログラムを起動するのとは異なり、FastCGIは常駐メモリのCGIプロセスを使用してソースの継続的な要求を処理します.これらのCGIプロセスは、ウェブサーバではなくFastCGI管理プロセス(FastCGI server)によって管理されます.Webリクエストを受信すると、Webサーバは、Unixドメインソケット(Unix domain socket)、名前付きパイプ(named pipe)、またはTCP接続(TCP connection)を介してFastCGIプロセスに必要な情報とページリクエスト自体を送信します(どのCGIプロセスに送信するかはFastCGI管理プロセスによって割り当てられます).同じ接続方式で、ウェブ応答はウェブサーバに返される.応答が返されると、今回の接続はオフになる可能性がありますが、Webサーバとこれらの処理要求のCGIプロセスはメモリに常駐し続け、次の要求の処理を待機します.したがって、各CGIプロセスは、CGIのように1つのウェブリクエストしか処理できないのではなく、そのライフサイクル内に複数のウェブリクエストを処理することができる.
    php-fpmPHP-FPM(FastCGI Process Manager)とは、PHP上のFastCGIの具体的な実装である、PHP 5からである.3.3から、PHPのインストールパッケージに統合されています.
    Apacheとphpの接続
  • CGI(ほぼ不要)
  • モジュール化(mod_php)
  • FastCGI

  • 具体的な構成は以下を参照してください.https://segmentfault.com/q/10...http://php.net/manual/en/inst...
    nginxとphpの接続方式
    通常はFastCGI方式を使用しています
    詳細構成リファレンスhttps://segmentfault.com/a/11...http://php.net/manual/en/inst...
    参考文献
    https://en.wikipedia.org/wiki...https://en.wikipedia.org/wiki...https://en.wikipedia.org/wiki...http://php.net/manual/en/inst...