ホームページ > バックエンド開発 > PHPチュートリアル > PHP カーネルを理解する: ライフサイクルと動作モード_PHP チュートリアル

PHP カーネルを理解する: ライフサイクルと動作モード_PHP チュートリアル

WBOY
リリース: 2016-07-12 08:56:27
オリジナル
981 人が閲覧しました

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 実装

PHP の CGI 実装の本質は、ソケット プログラミングを通じて TCP または UDP プロトコル サーバーを実装することであり、開始時に TCP/UDP プロトコル サーバーのソケット モニターを作成し、関連する処理リクエストを受け取ります。これは単なるリクエストの処理であり、モジュールの初期化、sapi の初期化、モジュールのクローズ、sapi のクローズなどを追加すると、CGI のライフサイクル全体が構成されます。

PHP カーネルを理解する: ライフサイクルと動作モード_PHP チュートリアル

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 サーバーは結果をブラウザーに返します。

高速CGI

fast-cgi は CGI のアップグレード版です。FastCGI は、有効化されている限り、毎回実行することができます (これが最も CGI です)。 fork-and-execute モードを批判しました)。

FastCGI の仕組み

FastCGI プロセス マネージャーは、Web サーバーの起動時にロードされます [PHP の FastCGI プロセス マネージャーは PHP-FPM (php-FastCGI プロセス マネージャー)] (IIS ISAPI または Apache モジュール)。FastCGI プロセス マネージャーは、それ自体を初期化し、複数の CGI インタープリター プロセスを開始します。複数の php-cgi.exe または php-cig が表示されます)、Web サーバーからの接続を待ちます。クライアント要求が Web サーバーに到達すると、FastCGI プロセス マネージャーが CGI インタープリターを選択して接続します。 Web サーバーは、CGI 環境変数と標準入力を FastCGI サブプロセス php-cgi に送信します。FastCGI サブプロセスが処理を完了すると、同じ接続から標準出力とエラー情報が Web サーバーに返されます。 FastCGI 子プロセスが接続を閉じると、リクエストが処理されます。次に、FastCGI 子プロセスは、FastCGI プロセス マネージャー (WebServer で実行されている) からの次の接続を待機して処理します。 通常の CGI モードでは、php-cgi.exe はここで終了します。 CGI モードでは、CGI が通常どれほど遅いか想像できるでしょう。 PHP へのすべての Web リクエストでは、php.ini を再解析し、すべての DLL 拡張機能を再ロードし、すべてのデータ構造を再初期化する必要があります。 FastCGI では、これらすべてがプロセスの開始時に 1 回だけ行われます。さらに、永続的なデータベース接続が機能するという利点もあります。

注: PHP の FastCGI プロセス マネージャーは PHP-FPM (PHP-FastCGI Process Manager) です

メリット

安定性の観点から、FastCGI は独立したプロセス プールを使用して CGI を実行します。単一のプロセスが停止した場合、システムはそれを簡単に破棄し、セキュリティの観点から新しいプロセスを再割り当てします。手術。 FastCGI はホスト サーバーから完全に独立しており、FastCGI がどのようにダウンしてもサーバーはダウンしません。FastCGI は動的ロジックの処理をサーバーから分離し、負荷の高い IO 処理を実行します。このように、通常の動的 Web ページでは、論理的な処理の一部しかなく、大量の静止画像などをホスト サーバーが思い切って IO できます。

足りない

マルチプロセスであるため、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-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 コマンドライン実行モードです。

PHP の開始フェーズと終了フェーズ

PHP は実行開始後に 2 つの主なフェーズを経ます。リクエストを処理する前の開始フェーズとリクエストの後の終了フェーズです。

開始フェーズ

モジュール初期化フェーズMINIT

SAPI ライフサイクル全体 (Apache の開始後のライフサイクル全体、またはコマンドライン プログラムの実行プロセス全体など) で、このプロセスは 1 回だけ実行されます。

Apache を起動すると、PHP インタープリターも起動します

PHP は各拡張機能 (モジュール) の MINIT メソッドを呼び出し、それによってこれらの拡張機能を使用可能な状態に切り替えます。

リーリー
モジュールアクティブ化フェーズRINIT

このプロセスはリクエストフェーズで発生します。たとえば、URL を通じてページがリクエストされた場合、モジュールのアクティブ化は各リクエスト (RINIT リクエストの開始) の前に実行されます。

リクエストが到着すると、SAPI レイヤーは制御を PHP レイヤーに渡し、PHP はこのリクエストのスクリプトを実行するために必要な環境変数を初期化します
たとえば、セッション モジュールの RINIT が php.ini で有効になっている場合、モジュールの RINIT を呼び出すと、$_SESSION 変数が初期化され、関連するコンテンツが読み込まれます。 PHP はすべてのモジュールの RINIT 関数を呼び出します。これは「初期化要求」です。

この段階で、各モジュールはいくつかの関連操作も実行できます。モジュールの RINIT 関数は、プログラムの実行前に自動的に開始される準備プロセスと見なすことができます。


エンドステージ

リクエストが処理された後、通常、スクリプトが最後まで実行されるか、exit() または die() 関数を呼び出すと、PHP は開始フェーズに対応して終了フェーズに入ります。終了フェーズも 2 つのリンクに分割され、1 つはリクエスト終了後 (RSHUWDOWN)、もう 1 つは SAPI ライフサイクルの終了時 (MSHUTDOWN) です。

リクエスト終了後(RSHUWDOWN)

リクエストが処理されると終了ステージに入り、PHP はクリーンアッププロセスを開始します。
各モジュールの RSHUTDOWN メソッドを順番に呼び出します。

RSHUTDOWN は、プログラムの実行中に生成されたシンボル テーブルをクリアする、つまり各変数の unset 関数を呼び出すために使用されます。

SAPI ライフサイクルの終了時 (MSHUTDOWN)

ついに、すべてのリクエストが処理されました
SAPIも閉店準備中です

PHP は各拡張機能の MSHUTDOWN メソッドを呼び出します
これは、各モジュールがメモリを解放する最後の機会です。
(これは CGI や CLI などの SAPI の場合であり、「次のリクエスト」がないため、SAPI はすぐに終了し始めます。)

PHP のライフサイクル全体が終了しました。 「開始ステップ 1」と「終了ステップ 2」は、サーバーからの要求がない場合にのみ実行されることに注意してください。

PHP の実行時に SAPI が通過するいくつかの段階

モジュール初期化

リーリー

リクエスト初期化フェーズ (Request init)

リーリー PHPスクリプトを実行する

シャットダウンをリクエスト

リーリー

モジュールのシャットダウン

リーリー

単一プロセス SAPI ライフサイクル

リーリー

多进程SAPI生命周期

通常PHP是编译为apache的一个模块来处理PHP请求。 Apache一般会采用多进程模式, Apache启动后会fork出多个子进程,每个进程的内存空间独立,每个子进程都会经过开始和结束环节 每个进程的开始阶段只在进程fork出来以来后进行,在整个进程的生命周期内可能会处理多个请求。 只有在Apache关闭或者进程被结束之后才会进行关闭阶段,在这两个阶段之间会随着每个请求重复请求开始-请求关闭的环节。
PHP カーネルを理解する: ライフサイクルと動作モード_PHP チュートリアル

多线程的SAPI生命周期

<code>多线程模式和多进程中的某个进程类似,不同的是在整个进程的生命周期内会并行的重复着 请求开始-请求关闭的环节.
</code>
ログイン後にコピー

在这种模式下,只有一个服务器进程在运行着,但会同时运行很多线程,这样可以减少一些资源开销,向Module init和Module shutdown就只需要运行一遍就行了,一些全局变量也只需要初始化一次,因为线程独具的特质,使得各个请求之间方便的共享一些数据成为可能。
PHP カーネルを理解する: ライフサイクルと動作モード_PHP チュートリアル


www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1113010.htmlTechArticlePHP内核了解:生命周期及运行模式 PHP运行模式 1)CGI(通用网关接口 / Common Gateway Interface) 2)FastCGI(常驻型CGI / Long-Live CGI) 3)CLI(命令...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート