ユーザーのリクエストがどのようにWebサーバー(Apache、Nginx、IIS、Light)を通過し、その逆を通過するか-対話して結果をユーザーに返す動的言語 (PHP など) を終了しますか?
この記事は個人的な意見について簡単に述べており、間違っている可能性がありますので、コメントして一緒に学びましょう。
1. 最初に、後の説明のためにいくつかの概念を明確にします
CGI: (共通ゲートウェイ インターフェイス) Http サーバーとバックエンド プログラム (PHP など) の間で対話する中間層。
動作原理と処理方法 (fork-and-execute モード):
1. Web サーバーからリクエストが到着したとき
2. CGI プロセスまたはスレッドをフォークする (構成管理、環境の初期化)
3.実行バックグラウンド スクリプト
4. 結果を Web サーバーに返します。
5. Web サーバーは結果をユーザーに返します。
FastCGI: 有効化後、毎回フォークする時間がかかりません。
動作原理と処理方法:
1. Web サーバーの起動時に FastCGI プロセス マネージャー (IIS ISAPI または Apache モジュール) をロードします
2. FastCGI プロセス マネージャーは自身を初期化し、複数の CGI インタープリター プロセス (可視の複数の php) を開始します。 -cgi プロセス) を実行し、Web サーバーからの接続を待機します
3. クライアント要求が Web サーバーに到達すると、FastCGI プロセス マネージャーが CGI インタープリターを選択して接続し、Web サーバーは CGI 環境変数を結合し、標準入力が Web サーバーに送信されます。 FastCGI 子プロセス php-cgi。
4. FastCGI サブプロセスは処理が完了すると、標準出力とエラー情報を Web サーバーに返します。 FastCGI 子プロセスが接続を閉じると、リクエストには処理が完了したことが通知されます。子プロセスは、FastCGI プロセス マネージャーから割り当てられた他のリクエストに応答し続けます。
PHP-FPM: PHP 専用の PHP FastCGI プロセス マネージャー。
PHP5.3.3 以降のバージョンには PHP-FPM が統合されています。
php-fpm は、メモリとプロセスを効果的に制御し、PHP 設定をスムーズにリロードできる、より優れた PHP 設定管理方法を提供します。
./configure php ソース コードを実行するときに、-enable-fpm パラメーターを追加して PHP_FMP を有効にします。
Spawn-FCGI: 一般的な FastCGI プロセス マネージャー。
2. PHP での CGI 実装:
PHP の CGI 実装は、基本的にソケット プログラミングを使用して TCP または UDP プロトコル サーバーを実装します。開始すると、TCP/UDP プロトコルをリッスンするサーバーを作成し、関連する処理要求を受け入れます。
CGI のライフ サイクルは次のとおりです: モジュールの初期化、SAPI の初期化、モジュールのシャットダウン、SAPI のシャットダウン。サーバー呼び出し Socket 関数は、TCP のストリーミング ソケットを作成します。
2. サーバーは、サーバーのローカル アドレスを以前に作成されたソケットにバインドするために、listen 関数を呼び出します。ソケットはリスナーとして機能し、クライアントがこのソケットに複数の接続を開始するのを待ちます。
4. サーバーは accept 関数を呼び出して、ブロッキング状態になります。クライアント プロセスが connect 関数を呼び出して接続を確立するまで。
5. クライアントとの接続を確立した後、サーバーは read_stream 関数を呼び出して、データを処理します。クライアントに応答を送信する書き込み関数。
3. PHP の現在の動作メソッド (Apache と Php は良い兄弟であるため、Apache サーバーを例に挙げます)
1. Apache ハンドラーメソッド (php は Apache サーバーのモジュールとして使用されます) )
1 PHP の解釈モジュールを so 拡張機能にコンパイルし、Apache のモジュールに追加する、改良された CGI メソッド。
設定方法: <p>1.编译PHP时,加上如下参数:</p> <p>cd php-source</p> <p>./configure --prefix=/home/weiyanyan/local/php --with-apxs2=/home/weiyanyan/local/apache/bin/apxs --with-mysql</p> <p>说明:—with-apxs2为apache中apxs相应目录,将在apache根目录下的modules下生成libphp5.so</p> <p>2.在apache的配置文件http.conf中增加 <p>LoadModule php5_module modules/libphp5.so <p>然后在<IfModule mime_module>节点下增加如下mime配置 <p>AddType application/x-httpd-php .php<br><img alt="Web サーバーと動的言語がどのように相互作用するか - CGI&FastCGI&FPM、Web サーバーの相互作用についての簡単な説明 - cgi_PHP チュートリアル" > </p>
モジュールモードでは実行できないことが前提です。 (コメントアウト: LoadModule php5_module modules/libphp5.so)
httpd.conf にアクションを追加します:Action application/x-httpd-php /cgi-bin/php-cgi
php-cgi が /cgi ディレクトリに見つからない場合, PHP bin から cp することができます。【PHP スクリプトを書いてスリープさせることができます (20); 実行する前に、マシンのプロセスに php-cgi プロセスがないことを確認してください。リクエストすると、対応するプロセスが生成されます。 1つのphp-cgiプロセスが複数のリクエストを処理できることはテストされていますが、この方法は現在では基本的に使用されていないため、詳細は詳しく調査されていません。 】
3. FastCGI モード
FastCGI モードは次のように分類できます: Apache 組み込みプロセス マネージャー、php-fpm プロセス マネージャー
Apache 組み込みプロセス マネージャー:
<p>mod_fastcgi的安装 <p>#wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz <p># tar -zxvf mod_fastcgi-2.4.6.tar.gz <p># cd mod_fastcgi-2.4.6 <p># cp Makefile.AP2 Makefile <p># vim Makefile 将Makefile中的路径改成你的apache的安装路径 <p># make install 安装成功 <p>安装成功后,会自动把mod_fastcgi.so复制到/usr/local/apache/modules目录 </p>
まず、fastcgi モジュールを httpd.conf 設定ファイルに追加します。
LoadModule fastcgi_module modules/mod_fastcgi.so
このモードをコメント化するかどうか、次の条件を満たす限り、この行 LoadModule php5_module modules/libphp5.so には関係がないようです。モジュールが構成されています
AddHandler php-fastcgi .php アクション php-fastcgi /cgi -bin/php-cgi
FastCgiServer /home/weiyanyan/local/apache/cgi-bin/php-cgi -processes 20
AddType application/x-httpd-php .php
は自動的に fastcgi モードに移行します。
次に、Apache を再起動します。この時点で ps aux|grep php を使用すると、多数の php-cgi プロセスが実行されていることがわかります。設定が有効であることを示します。
FPM メソッド
まず、fastcgi モジュールを httpd.conf 設定ファイルに追加します:LoadModule fastcgi_module modules/mod_fastcgi.so
このモード コメントは LoadModule php5_module modules/libphp5 をコメントしません。 .so 行は、次のモジュールが設定されている限り関係はありません
FastCgiExternalServer /home/weiyanyan/local/apache/cgi-bin/php-cgi -host 127.0。 0.1:9000
FPM のインストール 簡単に説明すると次のとおりです:
cd php-source./configure --prefix=/home/weiyanyan/local/php --with-apxs2=/ home/weiyanyan/local/apache/bin/apxs --with-mysql --enable-fpm
この時点で、Php の sbin ルート ディレクトリに php-fpm 実行プログラムが存在します。その設定ファイルは /etc です。 php ルート ディレクトリ下の /php-fpm.conf
設定を変更した後、Apache で php-fpm を起動するように対応するポートを設定するだけです。
[書き終えたばかりで、確認もせず、新年に家に帰ります...]
参考:
http://www.phppan.com/2011/05/php-cgi/
http://www.cnblogs.com/fangbo/archive/2011/12/02/2272400.html
http://blog.zyan.cc/nginx_php_v6/
http://www.bkjia.com/PHPjc/959695.html