ホームページ >バックエンド開発 >PHPチュートリアル >PHP カーネルを理解する: ライフサイクルと動作モード_PHP チュートリアル
1) CGI (共通ゲートウェイインターフェース)
2) FastCGI (常駐 CGI/ロングライブ CGI)
3) CLI (コマンドライン実行/コマンドラインインターフェイス)
4) Webモジュールモード(ApacheなどのWebサーバーが動作するモード)
5) ISAPI (インターネット サーバー アプリケーション プログラム インターフェイス)
注: PHP5.3 以降、PHP には ISAPI モードがなくなりました
CGI はプロトコルであり、プロセスなどとは何の関係もありません。では、fastcgi とは何でしょうか? Fastcgi は、CGI プログラムのパフォーマンスを向上させるために使用されます。
PHP の CGI 実装の本質は、ソケット プログラミングを通じて TCP または UDP プロトコル サーバーを実装することであり、開始時に TCP/UDP プロトコル サーバーのソケット モニターを作成し、関連する処理リクエストを受け取ります。これは単なるリクエストの処理であり、モジュールの初期化、sapi の初期化、モジュールのクローズ、sapi のクローズなどを追加すると、CGI のライフサイクル全体が構成されます。
CGI の正式名は「Common Gateway Interface」で、クライアントが Web ブラウザから Web サーバー上で実行されているプログラムにデータを要求できるようにします。
CGI は、クライアントとこのプログラムの間でデータを転送するための標準を記述します。
CGI の目的の 1 つは、どの言語にも依存しないことなので、言語に標準の入力、出力、および環境変数がある限り、CGI はどの言語でも作成できます。 php、perl、tclなど
CGI はすでに古いモデルであり、近年ではほとんど使用されていません。
ユーザーリクエストがあるたびに、最初に CGI サブプロセスが作成され、次にリクエストが処理され、処理後にサブプロセスが終了します。これが Fork-And-Execute モードです。 ユーザーリクエストの数が非常に多い場合、メモリやCPU時間などのシステムリソースが大量に占有され、パフォーマンスが低下します。 したがって、CGI を使用するサーバーには、接続要求と同じ数の CGI サブプロセスが存在することになり、サブプロセスの繰り返しロードが CGI パフォーマンスを低下させる主な原因となります。Web サーバーが /index.php のリクエストを受信すると、対応する CGI プログラム (PHP パーサー) が開始されます。次に、PHP パーサーは php.ini ファイルを解析し、実行環境を初期化し、リクエストを処理し、CGI で指定された形式で処理結果を返し、プロセスを終了します。その後、Web サーバーは結果をブラウザーに返します。
fast-cgi は CGI のアップグレード版です。FastCGI は、有効化されている限り、毎回実行することができます (これが最も CGI です)。 fork-and-execute モードを批判しました)。
注: PHP の FastCGI プロセス マネージャーは PHP-FPM (PHP-FastCGI Process Manager) です
マルチプロセスであるため、CGI マルチスレッドよりも多くのサーバー メモリを消費します。PHP-CGI インタープリタは、プロセスごとに 7 ~ 25 メガバイトのメモリを消費し、大量のメモリを取得します。
Nginx 0.8.46+PHP 5.2.14 (FastCGI) サーバーには 30,000 の同時接続があり、開始された 10 個の Nginx プロセスは 150M のメモリ (15M*10=150M) を消費し、開始された 64 個の php-cgi プロセスは 1280M のメモリ (20M*64) を消費します。 =1280M)、システム自体が消費するメモリを加えた合計メモリ消費量は 2GB 未満です。サーバーのメモリが小さい場合は、25 個の php-cgi プロセスしか開くことができないため、php-cgi によって消費される合計メモリはわずか 500M になります。
上記のデータは、Apache (バージョン 6) よりも 10 倍優れた Web サーバーを構築するための Nginx 0.8.x + PHP 5.2.13 (FastCGI) からの抜粋です
PHP の開始フェーズと終了フェーズPHP-CLIとはPHP Command Line Interfaceの略で、Webサーバー上で動作するPHP環境(PHP-CGI、ISAPIなど)とは異なり、コマンドライン上でPHPを実行するためのインターフェースです。
つまり、PHP はフロントエンドの Web ページを作成できるだけでなく、バックエンド プログラムの作成にも使用できます。 PHP CLI シェル スクリプトは PHP のすべての利点に適用され、スクリプトまたはサーバー側システムの作成、または Windows と Linux の両方で PHP-CLI モードの作成が可能になります。Linux では、PHP がインストールした拡張機能を確認するために「php -m」をよく使用します。これは、PHP コマンドライン実行モードです。
開始フェーズ
SAPI ライフサイクル全体 (Apache の開始後のライフサイクル全体、またはコマンドライン プログラムの実行プロセス全体など) で、このプロセスは 1 回だけ実行されます。モジュールアクティブ化フェーズRINITApache を起動すると、PHP インタープリターも起動します
PHP は各拡張機能 (モジュール) の MINIT メソッドを呼び出し、それによってこれらの拡張機能を使用可能な状態に切り替えます。
リーリー
このプロセスはリクエストフェーズで発生します。たとえば、URL を通じてページがリクエストされた場合、モジュールのアクティブ化は各リクエスト (RINIT リクエストの開始) の前に実行されます。リクエストが到着すると、SAPI レイヤーは制御を PHP レイヤーに渡し、PHP はこのリクエストのスクリプトを実行するために必要な環境変数を初期化します
この段階で、各モジュールはいくつかの関連操作も実行できます。モジュールの RINIT 関数は、プログラムの実行前に自動的に開始される準備プロセスと見なすことができます。
たとえば、セッション モジュールの RINIT が php.ini で有効になっている場合、モジュールの RINIT を呼び出すと、$_SESSION 変数が初期化され、関連するコンテンツが読み込まれます。 PHP はすべてのモジュールの RINIT 関数を呼び出します。これは「初期化要求」です。エンドステージ
リクエスト終了後(RSHUWDOWN)
各モジュールの RSHUTDOWN メソッドを順番に呼び出します。RSHUTDOWN は、プログラムの実行中に生成されたシンボル テーブルをクリアする、つまり各変数の unset 関数を呼び出すために使用されます。
SAPI ライフサイクルの終了時 (MSHUTDOWN)
SAPIも閉店準備中ですPHP は各拡張機能の MSHUTDOWN メソッドを呼び出します
PHP のライフサイクル全体が終了しました。 「開始ステップ 1」と「終了ステップ 2」は、サーバーからの要求がない場合にのみ実行されることに注意してください。
これは、各モジュールがメモリを解放する最後の機会です。
(これは CGI や CLI などの SAPI の場合であり、「次のリクエスト」がないため、SAPI はすぐに終了し始めます。)
PHP の実行時に SAPI が通過するいくつかの段階
リクエスト初期化フェーズ (Request init)
リーリー PHPスクリプトを実行するシャットダウンをリクエスト
リーリーモジュールのシャットダウン
リーリー単一プロセス SAPI ライフサイクル
リーリー
<code>多线程模式和多进程中的某个进程类似,不同的是在整个进程的生命周期内会并行的重复着 请求开始-请求关闭的环节. </code>
在这种模式下,只有一个服务器进程在运行着,但会同时运行很多线程,这样可以减少一些资源开销,向Module init和Module shutdown就只需要运行一遍就行了,一些全局变量也只需要初始化一次,因为线程独具的特质,使得各个请求之间方便的共享一些数据成为可能。