PHP カーネルを深く理解する (2) 概要 - PHP ライフサイクルと Zend エンジン
この記事は、「PHP カーネルを深く理解する」を参照しています。アドレス: https://github.com/ reeze/tipi
1. SAPI インターフェイス
SAPI (サーバー アプリケーション プログラミング インターフェイス) は、特定の PHP アプリケーションのプログラミング インターフェイスを指します。 PHP スクリプトは、Web サーバー、コマンド ライン、または他のプログラムへの埋め込みなど、さまざまな方法で実行できます。
Web サーバーとコマンド ライン プログラムを介したスクリプトの実行は大きく異なって見えますが、実際のプロセスは同じです。 Web サーバー メソッドが PHP スクリプトの実行結果を Web サーバーに返し、コマンド ラインが結果をコンソールに出力するだけです。
スクリプトの実行は SAPI インターフェース実装から始まりますが、さまざまな SAPI インターフェース実装がそれぞれの特定の作業を完了します。たとえば、Apache の mod_php SAPI 実装は、出力コンテンツで Apache から取得した情報を初期化する必要があります。他の SAPI 実装も同様です
2. 開始と終了
(1) PHP は実行開始後に 2 つの段階を経ます: リクエストを処理する前の開始段階とその後の段階です。終了フェーズ。開始フェーズには 2 つのプロセスがあります。最初のプロセスは、SAPI ライフ サイクル全体 (Apache の開始後のライフ サイクル全体、コマンド ライン プログラムの実行プロセス全体など) において、モジュール初期化フェーズ (MINIT) です。 プロセスは 1 回のみ実行します 。 2 番目のプロセスはモジュール アクティベーション フェーズ (RINIT) で、 リクエスト フェーズ で発生します。たとえば、URL を通じてページがリクエストされた場合、各リクエストの前にモジュール アクティベーション (RINIT リクエストの開始) が実行されます。 。たとえば、PHP がいくつかの拡張モジュールを登録すると、MINIT ステージのすべてのモジュールの MINIT 関数がコールバックされます。モジュールはこの段階で、定数の登録、モジュールで使用されるクラスの定義など、いくつかの初期化作業を実行します。モジュールが実装されると、これらのコールバック関数は次のマクロを通じて実装できます:
<span style="color: #000000;">PHP_MINIT_FUNCTION(myphpextension){ </span><span style="color: #008000;">//</span><span style="color: #008000;"> 注册常量或者类等初始化操作</span> <span style="color: #0000ff;">return</span><span style="color: #000000;"> SUCCESS; }</span>
リクエスト到着後の PHP 初期化スクリプトの基本環境 (実行の作成など) PHP 実行プロセスの保存を含む環境変数名と値の内容のシンボル テーブル、および現在のすべての関数、クラス、その他の情報のシンボル テーブル。次に、PHP はすべてのモジュールの RINIT 関数を呼び出します。この段階で、モジュールの RINIR 関数は、MINIT コールバック関数と似ています:
<span style="color: #000000;">PHP_RINIT_FUNCTION(myphpextension){ </span><span style="color: #008000;">//</span><span style="color: #008000;"> 例如记录请求开始时间 </span><span style="color: #008000;">//</span><span style="color: #008000;"> 随后在请求结束的时候记录结束时间,这样我们就能记录下处理请求所花费的时间了</span> <span style="color: #0000ff;">return</span><span style="color: #000000;"> SUCCESS;}</span>
リクエストが処理された後、PHP は通常、スクリプトが最後まで実行されるか、die() 関数または exit() 関数が呼び出されることで終了フェーズに入ります。終了フェーズには 2 つのリンクもあります。1 つはリクエストの完了後にモジュールを非アクティブ化することであり (RSHUTDOWN、RINIT に対応)、もう 1 つは SAPI ライフサイクルが終了したときにモジュールを閉じることです (Web サーバーの終了またはコマンドラインスクリプトが実行されて終了します) (MSHUTDOWN、MINIT に対応)。
<span style="color: #000000;">PHP_RSHUTDOWN_FUNCTION(myphpextension){ </span><span style="color: #008000;">//</span><span style="color: #008000;"> 例如记录请求结束时间,并把相应的信息写入到日志文件中</span> <span style="color: #0000ff;">return</span><span style="color: #000000;"> SUCCESS;}</span>(2) シングルプロセス SAPI ライフサイクル CLI/CGI モード PHP はシングルプロセス SAPI モードに属します。このタイプのリクエストは、リクエストを一度処理した後に閉じられます。 SAPI ライフサイクル: 開始 - リクエスト開始 - リクエストクローズ - 終了 (3) マルチプロセス SAPI ライフサイクル 通常、PHP はモジュールにコンパイルされますApache の場合、Apache は通常、複数の子プロセスをフォークアウトします。ただし、各子プロセスは開始段階と終了段階を経ます。各プロセスはプロセスがフォークされた後にのみ実行されるため、プロセスの存続期間全体にわたって複数のリクエストを処理できる可能性があります。シャットダウン フェーズは、Apache がシャットダウンされるか、プロセスが終了した後にのみ実行されます。これらの 2 つのフェーズでは、リクエストごとにリクエストが繰り返されます (リクエスト シャットダウン フェーズ )。 (4 ) マルチスレッド モードは、リクエストの開始からリクエストの終了までのプロセスがプロセスのライフ サイクル全体にわたって
並行して繰り返される点を除いて、マルチプロセス内のプロセスに似ています。
3. Zend エンジン Zend エンジンは PHP 実装の中核であり、言語実装のインフラストラクチャを提供します。たとえば、PHP 構文の実装、スクリプトのコンパイルと実行環境、拡張メカニズムとメモリ管理などです。ここでの PHP は、公式の PHP 実装を指します (現在 HHVM に発展している Facebook の Hiphop もあります。これまでのところ (このプロジェクト) PHP には標準の言語仕様がありません)、PHP はリクエスト処理やその他の Web サーバー インターフェイス (SAPI) を提供します。 )