ホームページ >バックエンド開発 >PHPチュートリアル >cgi、fastcgi、php-cgi、php-fpm切断
この記事では、cgi、fastcgi、php-cgi、および php-fpm の分析を紹介します。必要な友人はそれを参照できるようにします。
まず。皆さん、CGI は何のためにあるのでしょうか? CGI は、Web サーバーによって渡されるデータが標準形式であることを保証するもので、これは CGI プログラムの作成者にとって便利です。
Web サーバー (nginx など) は、単なるコンテンツのディストリビューターです。たとえば、/index をリクエストした場合.html
とすると、Web サーバーはファイル システム内でこのファイルを見つけてブラウザに送信します。ここで配布されるのは静的データです。さて、現在のリクエストが の場合 /構成ファイルによると、nginx は、これが静的ファイルではなく、PHP パーサーによって処理される必要があることを認識し、リクエストを処理して PHP パーサーに渡します。 Nginx はどのようなデータを PHP パーサーに渡しますか? URL、クエリ文字列、POST データ、HTTP ヘッダーが存在する必要があります。CGI は、どのようなデータをどのような形式で送信するかを規定するプロトコルです。リクエストを処理するバックエンド。 PHP コードで使用するユーザーがどこから来たのかを慎重に考えてください。
Web サーバーが /index.php
このリクエストの後、対応する CGI プログラムが開始されます。これが PHP パーサーです。次に、PHP パーサーは php.ini ファイルを解析し、実行環境を初期化し、リクエストを処理し、CGI で指定された形式で処理結果を返し、プロセスを終了します。その後、Web サーバーは結果をブラウザーに返します。
/index.html
,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。好了,如果现在请求的是/index.php
,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器。Nginx会传哪些数据给PHP解析器呢?url要有吧,查询字符串也得有吧,POST数据也要有,HTTP header不能少吧,好的,CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。仔细想想,你在PHP代码中使用的用户从哪里来的。当web server收到
/index.php
OK、CGI はプロトコルであり、プロセスなどとは何の関係もありません。では、fastcgi とは何でしょうか? Fastcgi は、CGI プログラムのパフォーマンスを向上させるために使用されます。
パフォーマンスを改善するには、CGI プログラムのパフォーマンス上の問題は何でしょうか? 「PHP パーサーは php.ini ファイルを解析し、実行環境を初期化します。」それだけです。標準 CGI はリクエストごとにこれらの手順を実行するため (疲れる必要はありません。プロセスを開始するのは非常に面倒です!)、毎回の処理時間は比較的長くなります。これは明らかに不合理です!では、Fastcgi はどのようにしてそれを行うのでしょうか?まず、Fastcgi はマスターを起動し、構成ファイルを解析し、実行環境を初期化してから、複数のワーカーを起動します。リクエストが届くと、マスターはそれをワーカーに渡し、すぐに次のリクエストを受け入れることができます。これにより作業の重複が回避され、当然効率が高くなります。また、十分なワーカーがない場合、マスターは構成に従っていくつかのワーカーを事前に開始し、待機することができます。もちろん、アイドル状態のワーカーが多すぎる場合は一部が停止されるため、パフォーマンスが向上し、リソースが節約されます。これがfastcgiのプロセス管理です。
cgi
cgi
通用网关接口,外部程序与web服务器之间的接口标准,是在cgi程序和web服务器之间传递信息的过程
每一次请求都会生成一个cgi进程,cgi程序执行完,进程退出
独立于服务器、独立编程语言
FastCgi
FastCgi 像是一个常驻型的Cgi,它可以一直执行这,只要激活后,不需要每次去fork一次,还支持分布式运算,即FastCgi程序可以在网站服务器以外的主机上执行并且接受来自其他网站服务器的请求
可以同时处理多个请求
长期占用内存
php-cgi
php官方自带的FastCGI 进程管理器
php.ini修改之后,必须kill掉php-cgi再启动php.ini 才生效。不可以平滑的重启
内存不能动态分配
php-fpm
外部プログラムと Web サーバー間のインターフェース標準である一般的なゲートウェイ インターフェースは、CGI プログラムと Web サーバーの間にあります。相互に情報を転送するプロセス
各リクエストは CGI プロセスを生成します。CGI プログラムが実行された後、プロセスはサーバーから独立して終了します
FastCgi
複数のリクエストを同時に処理できます
お久しぶりです
php-fpm
🎜🎜🎜🎜非公式の fastCgi プロセス マネージャー。後に php5.4 で開始され、現在は正式に含まれています、phpをコンパイルするとき、php-fpm🎜🎜🎜🎜を有効にするために-enable-fpmのみが必要です。これにより、php🎜🎜🎜🎜動的スケジューリングプロセス🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜Ngin xのみ責任を負うリバースプロキシ/リクエスト転送は、php-cgi プロセスの管理を担当しないため、Nginx は通常、作業プロセス (子プロセス) を単独で管理できる php-fpm とともに使用されます。 🎜 php-fpm は、独立した SAPI は php-cgi を管理しません。つまり、php-fpm は php-cgi とは関係がありません。php-fpm のサブプロセスはそれ自体でフォークされます。システム内の php-cgi を削除しても、php-fpm サービスの通常の動作には影響しません。🎜🎜php-fpm は、pm = static 設定の下でバックグラウンドに常駐する作業プロセスを持っています。つまり、5 つの作業プロセス pm.max_children = 5 を設定すると、php-fpm サービスが開始されると、自動的に 5 つの子プロセスがフォークアウトされ、リクエストの処理が完了した後も終了しません。 PHP スクリプトでデータベースを使用する場合、永続接続この時点で、これら 5 つのワーカー プロセスはデータベースへの 5 つの永続接続も確立して維持し、複数のリクエストを処理するときにデータベース接続リソースを再利用し、確立/解放を回避します。リクエストごとにデータベース接続 永続的な接続 タイムアウト後に自動的に再接続することもでき、これは php-fpm のスクリプトに対して完全に透過的です。スクリプトは開始時に永続的な接続の使用を指定するだけです。php-fpm は、バックグラウンドで常駐する pm = 動的構成 [部分] で動作します。つまり、サービスがビジー状態のときに、より多くのプロセスがフォークされます。一部のプロセスは自動的にシャットダウンされ、メモリがオペレーティング システムに返されます。つまり、PHP-FPM の動作モードは Apache のプリフォーク MPM に似ています。
php-cgi は、PHP によって作成された初期の公式 fastcgi マネージャーです。php.ini を変更すると、スムーズな再起動がサポートされません。有効にするには、元の php-cgi を強制終了して再起動する必要があります。動的ワーカー スケジューリングはサポートされていないため、最初に開始するワーカーの数のみを指定できます。
php-fpm は、5.3.3 で追加されたばかりの fastcgi プロセス マネージャーで、リクエストの圧力の変化に応じてワーカー プロセスの数を動的に増減できる動的スケジューリング機能が追加されており、reload コマンドをサポートしています。現在のリクエストの完了後にワーカー プロセスを再起動し、新しい php.ini 設定を適用できるようにします。
php54 は、php54 より前の関係の一種であり、php54 以降は別の関係です。
php54 より前は、php-fpm (サードパーティのコンパイル) がマネージャー、php-cgi がインタープリターです。
php54 以降は、php-fpm (正式に含まれる)、マスター モードとプール モード。 php-fpm と php-cgi は互いに何の関係もありません。 php-fpm はインタープリターでありマネージャーでもあります
参考 Web サイト https://www.zhihu.com/question/55835080
https://segmentfault.com/q/1010000000256516
関連する推奨事項:
CGI、FastCGI、PHP-FPMの関係図linux nginx、apache、php、php-fpm、mysqlおよび設定項目が配置されているディレクトリを表示します
以上がcgi、fastcgi、php-cgi、php-fpm切断の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。