ホームページ  >  記事  >  バックエンド開発  >  PHP ライフサイクル分析

PHP ライフサイクル分析

墨辰丷
墨辰丷オリジナル
2018-05-15 15:09:433758ブラウズ

この記事では主に PHP のライフサイクルについて説明します。PHP のライフサイクルを理解する前に、Apache と PHP の関係を理解する必要があります。興味のある方は参考にしてください。

1.Apacheの動作機構の解析


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





全体図は以下の通りです:




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

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



该过程发生在请求阶段, 例如通过url请求某个页面,则在每次请求之前都会进行模块激活(RINIT请求开始)。 

请求到达之后,SAPI层将控制权交给PHP层,PHP初始化本次请求执行脚本所需的环境变量

例如是Session模块的RINIT,如果在php.ini中启用了Session 模块,那在调用该模块的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 のライフサイクル全体が終了しました。なお、「第1ステップの開始」と「第2ステップの終了」はサーバからのリクエストがない場合のみ実行されます。

関連する推奨事項:

thinkPHP5.0フレームワークアプリケーションリクエストライフサイクル分析

vueコンポーネントライフサイクル使用法


React Native の概要コンポーネント 期間はどれくらいですか


以上がPHP ライフサイクル分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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