phpのいくつかの運転モードCLI、CGI、FastCGI、mod_php

3886 ワード

1、CLI:コマンドラインです.たとえば、コンソールまたはshellにコマンドを入力できます.
php -f index.php

そして出力を取得
 
2、CGI:以下は違う言い方と理解
パブリックゲートウェイインタフェース(Common Gateway Interface)、HTTPサーバは、ネットワークサーバ上で実行されるプログラムまたは他のマシン上のプログラムと「会話」するツールです.サーバ環境では、「プログラム」に標準的なインタフェースを提供します.このインタフェースを使用すると、「プログラム」はサーバとクライアントが交換する情報についていくつかのことをすることができます.「プログラム」の言葉は要求されていない.プログラムはインタフェースを操作します.サーバがCGIをサポートするには、CGIで要求される環境変数を提供するか、または他のものがあります.
HTTP Serverと独立したプロセス間のプロトコルは、HTTP RequestのHeaderをプロセスの環境変数に設定し、HTTP Requestの本文をプロセスの標準入力に設定し、プロセスの標準出力はHTTP ResponseがHeaderと本文を含む.
このWebサーバはUNIX shell環境変数を用いてWebサーバから渡されたパラメータを保存し,CGIを実行する独立したプロセスを生成する.
異なるタイプの言語で書かれたプログラムはcgi規格に合致すれば、cgiプログラムとしてwebサーバと対話することができる.
CGI方式で実行すると,web serverはユーザ要求をPHP独立プロセスにメッセージで渡し,PHPとwebサービスの間に依存関係はない.
 
個人理解:CGIはphpとweb serverのコミュニケーションのルールを規定し、response=exec(「php-f index.php-url=xxx-cookie=xxx-xxx=xxx」)を実行したことに相当する.
 
CGIとCLIの違いについては、公式ドキュメントを参照してください.http://php.net/manual/zh/features.commandline.php
本文ではCGIとCLIの著しい違いを述べた.
以下はCLI SAPIと他のCLI SAPIモジュールとの著しい違いである.
  • は、CGI SAPIとは異なり、ヘッダ情報が出力されない.CGI SAPIは、HTTPヘッダ情報をキャンセルする方法を提供するが、CLI SAPIでは、HTTPヘッダ情報の出力を開始するための同様の方法は存在しない.CLIはデフォルトではサイレントモードで開始されますが、互換性を保証するために、-qおよび--no-headerパラメータは後方互換性のために保持され、古いCGIスクリプトを使用できるようになります.実行時、作業ディレクトリはスクリプトの現在のディレクトリに変更されません(CGIモードと互換性のある-Cおよび--no-chdirパラメータを使用できます).エラーが発生した場合は、プレーンテキストのエラーメッセージ(HTML形式以外)を出力します.

  •  
    3、FastCGI:CGIには多くの欠点があり、1つのリクエストを受信するたびにforkのプロセス処理が必要で、1つのリクエストを受信して1つの応答しかできない.リクエストが終了するとプロセスは終了します.FastCGIは事前に起動し、cgiの管理サーバとして存在し、一連のサブプロセスを事前に起動して処理を待機し、webサーバからの要求を待機し、要求を受信するとサブプロセスに処理を任せる.このように、要求を受信した後にcgiを起動する必要がないため、より速くなる.FastCGIはプロセス/スレッドプールを使用して一連の要求を処理します.これらのプロセス/スレッドは、WebサーバではなくFastCGIサーバによって管理されます.要求が入ってくると、Webサーバは環境変数とこのページ要求をSocket長接続でFastCGIプロセスに渡す.FastCGIは常駐型のCGIのようで、リクエストが到着したときにforkのプロセスに時間をかけて処理することはできません(これはCGIが非難されているfork-and-executeモードです).通信プロトコルにすぎないため、FastCGIプログラムはWebサーバ以外のホスト上で実行され、他のWebサーバからのリクエストを受け入れることができる分散演算もサポートされています.
    FastCGI全体の流れ:
  • Web server起動時にFastCGIプロセスマネージャ
  • にロードする.
  • FastCGI自体が初期化され、複数のCGIインタプリタプロセス(複数のphp-cgiが見える)が開始され、Webサーバからの要求
  • が待機する.
  • Web serverを要求すると、Web serverはsocketを介してFastCGIプロセスマネージャを要求し、FastCGIプロセスマネージャはCGI解釈器を選択して接続し、Web serverはCGI環境変数と標準入力をFastCGIサブプロセスphp-cgi
  • に送信する.
  • FastCGIサブプロセス処理要求が完了すると、標準出力とエラーが同じ接続からWeb serverに返され、FastCGIサブプロセスが終了すると要求が終了する.FastCGIサブプロセスは、FastCGIプロセスマネージャからの次の接続の処理を待機し、CGIモードでphp-cgiはここで終了します.

  •  
    php-fpm:PHPのFastCGIプロセスマネージャ
     
    4、mod_php:すなわちapacheのphpモジュールは、PHPをweb-serverのサブプロセス制御とし、両者の間に依存関係がある.最も明らかな例はCGIモードでPHPを修正する場合である.INIのプロファイルは、Webサービスを再起動することなく有効になりますが、モジュールモードではWebサービスを再起動する必要があります.mod_でphpモードで動作PHPは、phpがapacheの1つのモジュールとして起動することを意味するため、apacheが起動するときのみphpが読み出される.Iniプロファイルをロードし、拡張モジュールをロードします.apacheの実行中に拡張モジュールを読み取り、ロードすることはありません.
    Apacheの動作モードpreforkの動作原理
    個別の制御プロセス(親プロセス)は、リクエストをリスニングして応答するために使用されるサブプロセスを生成します.Apacheは、いつもスタンバイ(spare)またはアイドルのサブプロセスを維持して、間もなく来るリクエストを迎えるようにしようとしています.これにより、クライアントは、サービスを受ける前にサブプロセスの生成を待つ必要がなくなります.Unixシステムでは、親プロセスは通常rootとして実行され、80ポートを邦定するために実行されますが、Apacheによって生成されたサブプロセスは通常、低特権のユーザーで実行されます.UserおよびGroup命令は、サブプロセスの低特権ユーザを構成するために使用される.サブプロセスを実行するユーザーは、サービスされているコンテンツに対して読み取り権限を持つ必要がありますが、サービスコンテンツ以外の他のリソースに対しては、できるだけ少ない権限を持つ必要があります.
    workerの動作原理
    各プロセスが持つスレッドの数は固定されています.サーバは負荷に応じてプロセス数を増やしたり減らしたりします.個別の制御プロセス(親プロセス)は、サブプロセスの確立を担当します.各サブプロセスは、ThreadsPerChildの数のサービススレッドと、アクセス要求をリスニングし、サービススレッドの処理および応答に渡すリスニングスレッドとを確立することができる.Apacheは、常にスタンバイ(spare)または空きサービススレッドプールを維持しようとしています.これにより、クライアントは、新しいスレッドまたは新しいプロセスの確立を待つ必要がなく、処理を得ることができる.Unixでは、80ポートをバインドできるように、親プロセスは通常rootとして起動し、Apacheはより低い権限のユーザーでサブプロセスとスレッドを確立します.UserおよびGroup命令は、Apacheサブプロセスの権限を構成するために使用されます.サブプロセスは、提供されたコンテンツに読み取り権限を持たなければならないが、できるだけ少ない特権を与えなければならない.また、suexecを使用しない限り、これらの命令構成の権限はCGIスクリプトに継承されます.
     
    個人的な理解:このモードはphpをapacheに埋め込み、apacheにphpファイルを解析する機能を加えることに相当する.