PHPプロセス管理について


1、CGIとは
CGIは「共通ゲートウェイインタフェース」(Common Gateway Interface)と呼ばれ、HTTPサーバはあなたのまたは他のマシン上のプログラムと「会話」するツールで、そのプログラムはネットワークサーバ上で実行する必要があります.
CGIは、標準入力、出力、および環境変数がある限り、任意の言語で記述できます.例えばphp,perl,tclなど
2、FastCGIとは
FastCGIは常駐(long-live)型のCGIのようで、ずっと実行していて、アクティブになったら、毎回forkに1回時間を費やすことはありません(これはCGIが最も非難されているfork-and-executeモードです).また、FastCGIプログラムは、Webサーバ以外のホスト上で実行され、他のWebサーバからのリクエストを受け入れることができる分散演算もサポートされています.
FastCGIは常駐(long-live)型のCGIのようで、ずっと実行していて、アクティブになったら、毎回forkに1回時間を費やすことはありません(これはCGIが最も非難されているfork-and-executeモードです).また、FastCGIプログラムは、Webサーバ以外のホスト上で実行され、他のWebサーバからのリクエストを受け入れることができる分散演算もサポートされています.
FastCGIは、言語に依存しないスケーラブルアーキテクチャのCGIオープン拡張であり、CGIインタプリタプロセスをメモリに保持し、パフォーマンスを向上させることが主な動作です.CGIインタプリタの反復ロードがCGI性能低下の主な原因として知られており、CGIインタプリタがメモリに保持され、FastCGIプロセスマネージャのスケジューリングを受けると、良好な性能、伸縮性、Fail-Over特性などを提供することができる.
3、FastCGIの動作原理
1.Webサーバ起動時にFastCGIプロセスマネージャ(IIS ISAPIまたはApache Module)にロードする
2、FastCGIプロセスマネージャ自身が初期化し、複数のCGIインタプリタプロセス(複数のphp-cgiが表示される)を開始し、Webサーバからの接続を待つ.  
3.クライアント要求がWebサーバに到達すると、FastCGIプロセスマネージャはCGIインタプリタを選択して接続する.Webサーバは、CGI環境変数と標準入力をFastCGIサブプロセスphp-cgiに送信します.    
4、FastCGIサブプロセスが処理を完了した後、標準出力とエラー情報を同一接続からWebサーバに戻す.FastCGIサブプロセスが接続を閉じると、リクエストは処理が完了します.次に、FastCGIサブプロセスは、Webサーバで実行されるFastCGIプロセスマネージャからの次の接続を待機して処理します.CGIモードではphp-cgi(PHP-CGIはPHPが持参したFastCGIマネージャです.)はここで終了します.
上記の場合、CGIが通常どれだけ遅いか想像できます.各WebリクエストPHPはphpを再解析する必要がある.ini、すべての拡張子を再ロードし、すべてのデータ構造を再初期化します.FastCGIを使用すると、これらはすべてプロセスの開始時に一度だけ発生します.追加の利点は、継続的なデータベース接続(Persistent database connection)が機能することです.
注記:
初期のWebサービスは,従来のCGIプロトコルに基づいて実現された.サーバに送信される要求ごとに、起動プロセス、処理要求、終了プロセスの3つのステップが必要であり、アクセス量が増加すると、メモリ、CPUなどのシステムリソースのオーバーヘッドも大きくなり、サーバのパフォーマンスが低下したり、サービスが中断したりします.
CGIプロトコルでは,解析器の繰返し負荷が性能低下の主な原因である.プロセッサプロセスをメモリに常駐させると、一度起動するだけで実行でき、毎回forkプロセスを再開する必要がなく、その後のFastCGIプロトコルがあります.
まとめ:
  • まず、FastCGIプロセスマネージャを初期化し、複数のCGIインタプリタサブプロセスを開始する.
  • 次に、要求がWebサーバに到達すると、プロセスマネージャはサブプロセスを選択して接続し、環境変数と標準入力を送信し、処理が完了した後、標準出力とエラー情報をWebサーバに返す.
  • 最終的に、サブプロセスは接続を閉じ、次の要求の到来を待ち続ける.

  • 4、PHP-FPMとは
    PHP-FPMはPHPがFastCGIプロトコルに対する具体的な実現であり、PHPが多種類のサーバー側アプリケーションプログラミングポート(SAPI:cgi、fast-cgi、cli、isapi、apache)で最も一般的で、性能が最も優れているプロセスマネージャでもある.
    PHP−FPMというモデルは非常に典型的なマルチプロセス同期モデルであり,要求がプロセススレッドに対応し,IOが同期ブロックであることを意味する.したがって、PHP-FPMは独立したCGIプロセスプール、システムを維持しているにもかかわらず、プロセスのライフサイクルを簡単に管理することができます.
    サーバのハードウェア施設に制約する、PHP-FPMは合理的なphp-fpmを指定する必要がある.conf構成:
    pm.max_children #       
    pm.start_servers #         
    pm.min_spare_servers #        ,           
    pm.max_spare_servers #        ,           
    pm.max_requests = 1000 #         ,       

    PHPプロセス自体にメモリ漏洩の問題はなく、各プロセスが要求処理を完了するとメモリが回収されるが、オペレーティングシステムに解放されることはなく、これにより大量のメモリがPHP-FPMに占有されて解放されず、要求量が上昇すると性能が急激に低下する.
    したがって、PHP−FPMは、単一のサブプロセス要求回数の閾値を制御する必要がある.多くの人がmax_と勘違いしますrequestsはプロセスの同時接続数を制御しているが,実際にはPHP−FPMモードでのプロセスは単一スレッドであり,要求は同時化できない.このパラメータの本当の意味は,要求カウンタの機能を提供し,閾値数を超えると自動的に回収し,メモリ圧力を緩和することである.
    PHP-FPMはメモリとプロセスを効率的に制御でき、PHP構成をスムーズに再ロードできる
    PHP-FPMアーキテクチャが優れているにもかかわらず、単一プロセスのパフォーマンスに問題があることを発見したかもしれません.
    未完待续..
    参考記事:
    http://taobaofed.org/blog/2015/11/24/nodejs-php-process-manager/
    http://www.mike.org.cn/articles/what-is-cgi-fastcgi-php-fpm-spawn-fcgi/