ホームページ  >  記事  >  バックエンド開発  >  PHPカーネル - ライフサイクルのグラフィックコードを詳しく解説

PHPカーネル - ライフサイクルのグラフィックコードを詳しく解説

黄舟
黄舟オリジナル
2017-03-09 09:31:472148ブラウズ

PHPのライフサイクルを理解する前に、まずApacheとphpの関係を理解し​​ましょう

1. Apacheの動作メカニズムの分析


--------------------------------





全体図は次のとおりです。 Apache フック メカニズム フック メカニズムは以下を指します: Apache はモジュール (内部を含む) を許可します。モジュールと外部モジュール (mod_php5.so、mod_perl.so など) ) は、リクエスト処理ループにカスタム関数を挿入します。言い換えれば、モジュールは Apache の任意の処理段階で独自の処理関数をフックすることができ、それによって Apache のリクエスト処理プロセスに参加することができます。

mod_php5.so/ php5apache2.dll は、フック メカニズムを通じて、含まれているカスタム関数を Apache に挿入し、Apache 処理プロセスの各段階で php リクエストを処理する役割を果たします。

Apache がどのように PHP にフックするかがわかったので、Apache が PHP に転送された後のプロセス ロジックを見てみましょう。



2.PHPの実行フロー図

PHPの開始ステージと終了ステージ

PHP は実行開始後に 2 つの主要な段階を経ます: リクエストを処理する前の開始フェーズとリクエストの後の終了フェーズ。 2.1 SAPI が PHP を実行するときに通過するいくつかの段階

Module init

つまり、各拡張機能のソースコードの PHP_MINIT_FUNCTION のメソッドを呼び出して、モジュールの初期化、モジュールに必要ないくつかの変数の適用、メモリの割り当てなどを行います。

  1. Request init

クライアントのリクエストを受信した後、各拡張 PHP_RINIT_FUNCTION のメソッドが呼び出され、PHP スクリプトの実行環境が初期化されます。

  1. PHP スクリプトを実行します (この手順はほとんどの PHP プログラマーにとって馴染みのあるもので、作成したコードはここで実行されます)

  2. リクエストシャットダウン

この時点で、PHP_RSHUTDOWN_FUNCション各拡張機能のメソッドが呼び出されてリクエスト サイトがクリーンアップされ、ZE が変数とメモリのリサイクルを開始します

  1. モジュールを閉じる (モジュール シャットダウン)

Web サーバーが終了するか、コマンド ライン スクリプトが実行されました 終了すると、次のリンクを通じて拡張ソース コードの PHP_MSHUTDOWN_FUNCTION メソッドが呼び出されます



: start - request start - request close - end SAPI インターフェイスの実装はライフサイクルを完了します


2.2 開始フェーズ

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

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

Apache の起動後、PHP インタープリターも起動し、

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

//これは、新しい DLL モジュールが導入されたときに Apache を再起動する必要がある理由でもあります。 php.ini

PHP_MINIT_FUNCTION(myphpextension)
{
    // 注册常量或者类等初始化操作
    return SUCCESS; 
}




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

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

リクエストが到着すると、SAPI層は制御をPHP層に渡し、PHPはこのリクエストのスクリプトを実行するために必要な環境変数を初期化します

たとえば、Sessionモジュールの場合はSessionモジュールのRINITです。 php.ini で有効になっている場合、このモジュールの RINIT を呼び出すと、$_SESSION 変数が初期化され、関連するコンテンツが読み込まれます。その後、PHP はすべてのモジュールの RINIT 関数を呼び出します。これは「初期化の要求」です。

在这个阶段各个模块也可以执行一些相关的操作, 模块的RINIT函数和MINIT函数类似 ,RINIT方法可以看作是一个准备过程,在程序执行之前就会自动启动。


PHP_RINIT_FUNCTION(extension_name) {
      /* Initialize session variables, pre-populate variables, redefine global variables etc */
}




2.3结束阶段

请求处理完后就进入了结束阶段, 一般脚本执行到末尾或者通过调用exit()或者die()函数,PHP都将进入结束阶段. 和开始阶段对应,结束阶段也分为两个环节,一个在请求结束后(RSHUWDOWN),一个在SAPI生命周期结束时(MSHUTDOWN).、

2.3.1请求结束后(RSHUWDOWN)

请求处理完后就进入了结束阶段,PHP就会启动清理程序。 

它会按顺序调用各个模块的RSHUTDOWN方法。 

RSHUTDOWN用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。

PHP_RSHUTDOWN_FUNCTION(extension_name) {
/* Do memory management, unset all variables used in the last PHP call etc */
}




2.3.2 SAPI生命周期结束时(MSHUTDOWN)

最后,所有的请求都已处理完毕 

SAPI也准备关闭了 

PHP调用每个扩展的MSHUTDOWN方法 

这时各个模块最后一次释放内存的机会。 

(这个是对于CGI和CLI等SAPI,没有“下一个请求”,所以SAPI立刻开始关闭。)


PHP_MSHUTDOWN_FUNCTION(extension_name) {
	/* Free handlers and persistent memory etc */
}



整个PHP生命周期就结束了。要注意的是,只有在服务器没有请求的情况下才会执行“启动第一步”和“关闭第二步”。




以上がPHPカーネル - ライフサイクルのグラフィックコードを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。