まず、PHP のライフサイクルについて説明します。PHP プログラムが最初から最後までどのようなプロセスを経るのかを理解することは、PHP を学習する上で、また日々の PHP 開発を行う上で非常に重要です。
開始フェーズと終了フェーズ:
- php の起動フェーズとシャットダウンフェーズは 2 つのレベルに分けることができます。
- 最初の層は、PHPインタープリター全体による構造体と値の初期化処理です。
- 2 番目のレイヤーは、各ページのリクエスト プロセス中にあります。
- 拡張機能ごとに、初期化 MINT 関数が存在します。このプロセスでは、変数、クラス、レジスタ リソース、ストリーム、およびフィルター プロセッサが宣言されます。これらの操作はすべてのリクエストに存在するため、永続的と呼ぶことができます。一般に、次の 2 つの手順が実行されます。
-
REGISTER_INI_ENTRIES()
-
モジュールのグローバル変数を初期化する
-
ページがリクエストを行うと、PHP はシンボル テーブルと設定値を含む動作環境を確立します。次に、PHP インタープリタは各拡張機能を再度実行し、各拡張機能の RINIT 初期化関数を呼び出します。 RINT 関数の一般的な動作は次のとおりです。
-
globalvalue をデフォルト値に設定します。これらのグローバル変数は多くの場合、各リクエストで必要になりますが、各リクエストでは互いに独立しています。
-
使用する必要がある変数は、呼び出しの準備としてシンボル テーブルに配置する必要があります。
-
この機能では、リクエストの関連情報を記録することもできます
-
リクエストの処理が完了した後、スクリプトの終わりに到達するか、 die() exit() によって終了すると、PHP は RSHUTDOWN() を呼び出してクリーンアップを開始します。
- このとき、各シンボルテーブルの変数は設定解除されます
- すべてのリクエストが満たされると、モジュールの MSHUTDOWN プロセスが開始されます。
-
UNREGISTER_INI_ENTRYES()の呼び出しはMINIT関数の初期化処理に相当します。
PHP プログラム実行のライフサイクル:
ライフサイクルを理解するには、さまざまな実行メソッドを参照する必要があります。 PHP はいくつかの異なる方法で実行でき、それぞれに独自のライフサイクルがあります。
- CLI: コマンドラインからphpプログラムを実行するもので、ライフサイクルが最も単純です。例えばtest.phpを実行すると以下のような処理が行われます
-
- 図 1 CLI PHP 実行プロセス
- MINIT RINIT RSHUTDOWN MSHUTDOWN は 1 回だけ呼び出されることに注目してください。これはウォーターフォール構造に似ています。
- マルチスレッドモジュール方式: これは、PHP が Apache と連携する APXS モジュールとして機能する最も一般的に使用される方式です。 Apache が起動すると、多くの子プロセスがフォークされます。複数の異なるリクエストに対して、複数の異なる初期化プロセスと終了プロセスが調整されます。ただし、スレッドごとに、MINIT と MSHUTDOWN の呼び出しは 1 回だけです。各リクエストは、独自の個別の RINIT および RSHUTDOWN に対応します。
- マルチスレッド モジュール方式: マルチスレッド方式では、異なるスレッドが MINIT/MSHUTDOWN を繰り返し呼び出すことを回避できます。複数のリクエストで情報を共有できるという利点がありますが、リクエスト間の分離要件が比較的高く、そうでない場合は変数が発生する可能性があります。 . アクセスエラー。
Zend スレッドセーフ
php には、スレッドセーフリソース管理 (TSRM) と呼ばれる、スレッドセーフのための特別なメカニズムがあります。スレッドセーフな宣言を行う場合と非スレッドセーフな宣言を行う場合には明らかにいくつかの違いがあります:
- スレッドセーフな変数宣言:
-
typedef 構造体 {
intsampint;
char *サンプル文字列;
php_sample_globals;
intsample_globals_id;
PHP_MINIT_FUNCTION(サンプル)
{
ts_allocate_id(&sample_globals_id,
sizeof(php_sample_globals),
(ts_allocate_ctor) php_sample_globals_ctor,
(ts_allocate_dtor) php_sample_globals_dtor);
成功を返します;
}
このコードからわかるように、MINIT ステージでは、ts_allocate_id 関数を通じてこのプログラムが必要とするスペースの量を TSRM に通知する必要があります。これにより、TSRM は現在のスペース消費量を増やし、スレッド データの対応する部分を指す ID を返します。プール。 -
データへのアクセス要求が行われると、まず現在のスレッドのリソース プールへのポインタが TSRM 層から検出され、次に ts_allocate_id() によって返されたリソース ID がオフセットとして追加されます。
- 非スレッドセーフ変数宣言:
-
typedef 構造体 {
-
intsampint;
char *サンプル文字列;
php_sample_globals;
php_sample_globals サンプル_グローバル;
PHP_MINIT_FUNCTION(サンプル)
{
php_sample_globals_ctor(&sample_globals TSRMLS_CC);
成功を返します;
}