1. CLI: たとえば、コンソールまたはシェルで次のコマンドを入力できます。 リーリー
次に出力を取得します
2. CGI: 以下は異なる説明と理解です
「共通ゲートウェイ インターフェイス」 (共通ゲートウェイ インターフェイス) は、HTTP サーバーが自分または他のマシンのプログラムと「通信」するためのツールであり、そのプログラムはサーバー環境でネットワーク サーバー上で実行する必要があります。標準の「プログラム」を提供します。 「プログラム」がサーバーとクライアント間で交換される情報を使用して何かを実行できるインターフェース。「プログラム」の言語は、サーバーが CGI などの環境変数をサポートする必要はありません。
HTTP サーバーと独立したプロセス間のプロトコルは、HTTP リクエストのヘッダーをプロセスの環境変数に設定し、HTTP リクエストの本文をプロセスの標準入力に設定し、プロセスの標準出力は HTTP レスポンスですヘッダーとボディを含みます。
この Web サーバーは、
UNIX シェル環境変数を使用して Web サーバーから渡されたパラメーターを保存し、CGI を実行する独立したプロセスを生成します。 さまざまな種類の言語で書かれたプログラムが CGI 標準に準拠している限り、CGI プログラムとして Web サーバーと対話できます
CGI モードで実行している場合、Web サーバーはユーザーのリクエストをメッセージの形式で PHP の独立したプロセスに転送します。PHP と Web サービスの間には何の関係もありません。
個人的な理解: CGI は php と Web サーバー間の通信のルールを規定しています。これは、response = exec("php -findex.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にはHTTPヘッダー情報をキャンセルするメソッドが用意されていますが、
CLI SAPIにはHTTPヘッダー情報の出力を有効にする同様のメソッドがありません。 CLI はデフォルトで Quiet モードで起動しますが、互換性を確保するために、-q パラメータと --no-header パラメータは下位互換性のために保持されており、古い CGI スクリプトの使用が可能です。
実行中、作業ディレクトリはスクリプトの現在のディレクトリに変更されません (CGI モードと互換性を持たせるために -C および --no-chdir パラメータを使用できます)。
エラー発生時に平文エラーメッセージ(HTML形式ではない)を出力します。
FastCGI の
プロセス全体:
Webサーバーの起動時にFastCGIプロセスマネージャーをロードします
FastCGI サブプロセスはリクエストを処理した後、同じ接続から Web サーバーに標準出力とエラーを返します。FastCGI サブプロセスが終了すると、リクエストも終了します。次に、FastCGI 子プロセスは、FastCGI プロセス マネージャーからの次の接続を処理するのを待ち、その時点で php-cgi は CGI モードで終了します。
php-fpm: PHP 用 FastCGI プロセスマネージャー
4. mod_php: Web サーバーのサブプロセスとして PHP を制御する Apache の php モジュール。最も明らかな例は、PHP の設定ファイルの場合です。 .INI が変更されると、Web サービスを再起動しなくても有効になりますが、モジュール モードでは Web サービスを再起動する必要があります。 PHP を mod_php モードで実行すると、php は Apache のモジュールとして起動されます。したがって、Apache の起動時にのみ php.ini 設定ファイルが読み込まれます。拡張モジュールをロード中
Apache 動作モード プリフォーク動作原理
別の制御プロセス (親プロセス) は、リクエストをリッスンして応答するために使用される子プロセスの生成を担当します。 Apache は、今後のリクエストに備えて、常にいくつかの予備またはアイドル状態の子プロセスを保持しようとします。このように、クライアントはサービスを取得する前に子プロセスが生成されるのを待つ必要がありません。 Unix システムでは、親プロセスは通常、ポート 80 をバインドする root として実行されますが、Apache によって生成された子プロセスは通常、低い特権のユーザーとして実行されます。 User ディレクティブと Group ディレクティブは、子プロセスに対して権限の低いユーザーを構成するために使用されます。子プロセスを実行するユーザーは、提供しているコンテンツに対する読み取り権限を持っている必要がありますが、サービス コンテンツ以外の他のリソースに対する権限はできるだけ少なくする必要があります。
ワーカーの仕組み
各プロセスが持つことができるスレッドの数は固定されています。サーバーは負荷に基づいてプロセスの数を増減します。別の制御プロセス (親プロセス) が子プロセスの確立を担当します。各子プロセスは、ThreadsPerChild の数のサービス スレッドとリスニング スレッドを確立できます。リスニング スレッドは、アクセス要求をリッスンし、処理と応答のためにサービス スレッドに渡します。 Apache は常に、サービス スレッドのスペアまたはアイドル プールを維持しようとします。このようにして、クライアントは、新しいスレッドまたはプロセスが処理される前に、確立されるのを待つ必要がありません。 Unix では、ポート 80 をバインドできるようにするために、通常、親プロセスは root として起動され、その後、Apache はより低い権限を持つユーザーとして子プロセスとスレッドを作成します。 User ディレクティブと Group ディレクティブは、Apache 子プロセスの権限を構成するために使用されます。子プロセスには、それが提供するコンテンツへの読み取りアクセスが必要ですが、できる限り少ない権限を与える必要があります。さらに、suexec が使用されない限り、これらの命令によって設定された権限は CGI スクリプトによって継承されます
個人的な理解: このモードは php を Apache に埋め込みます。これは、php ファイルを解析する機能を Apache に追加するのと同じです。