SAPIの詳細


一、SAPI比較
1. SAPI
サーバアプリケーションプログラミングインタフェースは、サーバとプログラミング言語の間でインタラクティブなインタフェースです.例えばLinuxコマンドラインはPHPコードを実行しますが、実はLinux shellはPHP SAPIを通じてパラメータのセットを転送し、zendエンジンが実行した後にshellに戻ります.PHPライフサイクルの各段階において、サービスに関連するいくつかの操作はSAPIインタフェースによって実現される.
php_sapi_name()      SAPI     。  
  cli(php -r "echo php_sapi_name();")、fpm-fcgi 

2.PHP運転とロードの4段階
①Minitモジュール初期化フェーズでは、php拡張、クラスライブラリの内部変数、登録定数、モジュールが使用するクラスなどを初期化できます.
②Rinit要求初期化段階では、モジュールを初期化してアクティブ化すると、PHP実行環境が作成され、$_SERVER,$_SESSIONなどの今回の要求に必要な環境変数が初期化されます.
③Rshutdown要求クローズフェーズは、最後のクリーンアップを実行し、今回の要求を処理するすべてのリソース(申請の変数)を解放します.リクエストの完了は、スクリプトの完了まで実行するか、die()またはexit()関数の完了を呼び出すかのいずれかです.
④Mshutdownモジュール回収フェーズは、自分のカーネルサブシステムを閉じ、未保存を解放するために使用されます.
3.SAPI 5種運転モード
①シングルプロセスモード(CLI,CGI)は、PHPスクリプトを実行するたびに、第2部で説明した4つのINTイベントとShutdownイベントを実行します.ユーザの要求数が非常に多い場合、メモリ、CPU時間などのシステムのリソースが大量に占有され、システムのオーバーヘッドが大きい
②マルチプロセスモード(Apacheの下のprefork MPMモード)、forkのとても多いサブプロセスができて、各サブプロセスは自分の独立したプロセスアドレス空間を持って、1つのサブプロセスの中で、PHPのライフサイクルはMINT起動を呼び出した後で、何度も要求を実行します(RINT/RSHUTDOWN)では、Apacheがオフまたはプロセスが終了した後にMSHUTDOWNが回収フェーズに呼び出されます.マルチプロセスモデルでは、各サブプロセスは独立して実行され、コードとデータ共有がないため、サブプロセスの終了と再生成が終了し、他のサブプロセスの安定性に影響しません.
③マルチスレッドモード(Apache 2のWorker MPM)は、一つのプロセスで複数のスレッドを作成し、同じプロセスアドレス空間で実行する
④fastCGIモード、nginx+php-fpmがこのモード、fast-cgiはCGIのアップグレードバージョンで、FastCGIは常駐型のCGIと見なすことができ、それはずっと実行していて、実行後にforkの複数のプロセスを実行することができて、時間をかけて動的にForkのサブプロセスを使う必要はありません.MINT/MSHUTDOWNを毎回呼び出す必要もありません.⑤内蔵モードで、C/C++言語の中でPHPが提供する関数を呼び出すことができます、運転モードはCGIと同様、4段階実行
二、php-fpm運転原理
  • CGI:プロトコルで、サーバーが要求を開始し、PHP解析器に転送し、どのデータを転送し、どのフォーマットで、CGIによって
  • を決定します.
  • fastcgi:プロトコルで、CGIの性能を高めるので、毎回初期化する必要はありません.プロセスは十分ではありません.いくつかのプロセスを事前に起動します.プロセスの空きが多すぎても停止します.fastCGIはプロセスの管理、性能を高め、リソースを節約します.
  • php-fpm:fastCGIプロトコルを実装するプログラムは、PHPによって公式に受信され、プロセス管理機能も提供されている.プロセスにはmasterプロセスとworkerプロセスの2つのプロセスが含まれている.masterプロセスは1つしかなく、ポート配布要求を傍受し、Webサーバからの要求を受信するが、workerプロセスには一般的に複数ある(具体的な数は実際のニーズに応じて構成される).各プロセスの内部にはPHP解釈器が埋め込まれており、PHPコードが本当に実行されている場所です.
  • php-cgi:cgi解釈器プロセス
  • FastCGIの動作原理:
  • Webサーバ起動時にFastCGIプロセスマネージャ
  • にロード
  • FastCGIプロセスマネージャ自身が初期化し、複数のCGIインタプリタ(複数のphp-cgiが表示される)を起動し、Webサーバからの接続
  • を待つ
  • クライアント要求がWebサーバに到達すると、FastCGIプロセスマネージャはCGIインタプリタを選択して接続する.WebサーバはCGI環境変数と標準入力をFastCGIサブプロセスphp-cgi
  • に送信する
  • FastCGIサブプロセスが処理を完了すると、標準出力とエラー情報が同じ接続からWebサーバに戻る.FastCGIサブプロセスが接続を閉じると、要求は処理完了を通知する.FastCGIサブプロセスは、FastCGI継承マネージャからの次の接続
  • を待機して処理する.
    FastCGIを使用すると、システムのオーバーヘッドが小さくなります.また、データベースとMemcacheの継続的な接続で動作します.
    データベース短接続connect:要求クローズフェーズ、要求に使用されるリソースの解放、データベース接続ハンドルの解放
    データベース長接続pconnect:要求が閉じると、PHPは今回の接続を収容し、アクティブに閉じても閉じずに収容し、次回同じ接続を開く要求がある場合、PHPは直接収容したハンドルを取り出し、接続を確立する過程を省く.
    php-fpmは長い接続を実現するにも、データベースのいくつかの構成に協力する必要があります.1つのプロセスは1つの接続を保持し、データベースの接続の数はサブプロセスの数であるため、データベースの許可接続数はサブプロセスの数より大きくなります.
    三、php-fpmプロセス管理の三つのモード
    php-fpmは、static、ondemand、dynamicの3つの実行モードをサポートし、デフォルトはdynamicです.
  • static:静的モードで、起動時に固定されたworkerプロセスが割り当てられます.max_childrenの数だけを考慮する必要があります.数はcpuの個数とアプリケーションの応答時間に依存します.
  • ondemand:オンデマンドで割り当てられ、起動時にはプロセスが割り当てられず、ユーザーの要求を受けたときにプロセスが開始されます.masterプロセスはワークプロセスの数が制限されているかどうか、空きワークプロセスがあるかどうかを確認し、ワークプロセスを新規作成しません.大トラフィックのシステムではmasterプロセスが忙しくなり、システムcpuリソースを占有し、大トラフィック環境の導入に適していません.
  • dynamic:ダイナミックモード、起動時に固定のプロセスを割り当てる.リクエスト数の増加に伴い、設定されたフローティングレンジでworkerプロセスを調整する.
  •  pm = dynamic  //      ,       ,     static,             ,    。
     
     pm.max_children = 50 //      ,ps aux    
     
     pm.start_servers = 20 //            
     
     pm.min_spare_servers = 5 //            ,           ,php-fpm          。
     
     pm.max_spare_servers = 35 //            ,           ,     。
     
     pm.max_requests = 500  //               ,     ,      。           ,           。         ,              ,    ,    PHP          。   0        。
     

    四、php-fpmスローログ
    phpのWebサイトにアクセスできる場合、アクセス速度が遅くなると、php-fpmの遅い実行ログを通じて、phpのスクリプトがどこで実行時間が長くなるかを明確に知ることができ、特定のコード行にナビゲートすることができます.
     vim /usr/local/php/etc/php-fpm.d/www.conf
     request_slowlog_timeout = 1 //    
     slowlog = /usr/local/php/var/log/www-slow.log
       php-fpm /etc/init.d/php-fpm reload

    phpファイルにsleep(3);行を追加し、実行後に結果を返します.
    参考文献
    1、https://www.jianshu.com/p/c9a... php-fpmプロセス管理の3つのモード2、https://www.jb51.net/article/... SAPIの5種類の運転モード3、http://blog.51cto.com/1260661... php-fpmスローログ4、https://www.cnblogs.com/wpjam... php-fpmとmysql長接続