PHP の仕組み

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-06-13 12:24:121514ブラウズ

PHP の実行方法

この記事では、PHP コードがどのように解釈および実行されるか、および PHP スクリプト実行のライフ サイクルについて説明します。

概要

PHP サービスの起動。厳密に言えば、PHP 関連のプロセスは、Apache の起動時に手動で開始する必要はありません。もちろん、PHP サービスを再起動する必要がある場合は、PHP サービスを手動で再起動することもできます。たとえば、オペコードを有効にして正式な環境でコードを更新した後、PHP を再起動して PHP コードを再コンパイルする必要があります。

マクロの観点から見ると、PHP カーネルの実装は、入力データを受け取り、内部で対応する処理を実行し、結果を出力することです。 PHP カーネルの場合、記述した PHP コードはカーネルによって受信された入力データであり、コード データを受信した後、PHP カーネルは記述したコードに対してコード解析と演算実行を実行し、最終的に対応する演算結果を返します。

ただし、通常の C 言語コードとは異なり、PHP コードを実行するには、まず PHP コードを機械語に「変換」して、対応する機能を実行する必要があります。 「翻訳」ステップを実行するには、PHP カーネルが字句解析、構文解析、その他のステップを実行する必要があります。最後に、PHP カーネルの Zend Engine に渡されて、順次実行されます。

字句解析

PHP コードを「ユニット」に分割 (TOKEN)

構文解析
変換 " 「unit」を Zend Engine で実行可能な操作に変換

Zend Engine 実行
構文解析で得られた操作を順番に実行

すべての PHP プログラムの先頭 ( CGI/CLI) は、SAPI (サーバー アプリケーション プログラミング インターフェイス) インターフェイスから始まります。 SAPI は、特定の PHP アプリケーションのプログラミング インターフェイスを指します。たとえば、Apache の mod_php です。

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

開始フェーズ

PHP の開始フェーズ全体は、モジュールの初期化とモジュールのアクティブ化という 2 つのフェーズを経ます。

MINIT

はモジュールの初期化フェーズであり、Apache/Nginx の起動後のライフサイクル全体、またはコマンド ライン プログラムの実行中に発生します。フェーズは 1 回だけ発生します

RINIT
モジュールのアクティブ化はリクエスト フェーズで発生します。定数の登録、モジュールで使用されるクラスの定義など、いくつかの初期化作業を実行します。

モジュールが実装されると、これらのコールバック関数は次のマクロを通じて実装できます:

PHP_MINIT_FUNCTION(myphpextension){//注册常量或者类等初始化操作return SUCCESS;}PHP_RINIT_FUNCTION(myphpextension){//例如记录请求开始时间//随后在请求结束的时候记录结束时间。这样我们就能够记录处理请求所花费时间了return SUCCESS;}

PHP スクリプトのリクエストが処理された後、PHP は通常、スクリプトが最後まで実行されるか、exit または die 関数が呼び出されたときに終了フェーズに入ります。

終了フェーズ

PHP の終了フェーズは、モジュールの非アクティブ化とモジュールの終了の 2 つの部分に分かれています。

RSHUTDOWN
モジュールを無効にする (RINIT に対応)

MSHUTDOWN
モジュールを閉じる (MINIT に対応)

CLI/CGI モード PHP はシングルプロセス SAPI モードに属します。これは、PHP スクリプトが一度実行された後に閉じられ、すべての変数と関数が使用できなくなることを意味します。つまり、CGI モードでは、同じ PHP ファイルの変数を他の PHP ファイルで使用することはできません。

例を使用して、シングルスレッド PHP の SAPI ライフサイクルを見てみましょう。

シングルスレッド SAPI ライフサイクル
例:

php -f test.php

各拡張機能の MINIT モジュール初期化を呼び出します
test.php を要求します
各拡張機能の RINIT モジュールを呼び出してアクティブ化します
test.php を実行します
各拡張機能の RSHUTDOWN を呼び出してモジュールを非アクティブ化します
test.php の実行後に変数とメモリをクリーンアップします
各拡張機能の MSHUTDOWN を呼び出す モジュールを閉じる
PHP の実行を停止する

上記は単純な実行処理ですが、以下にいくつか追加します。

PHP には、各モジュールのモジュール初期化を呼び出す前に、次のような初期化プロセスがあります。

いくつかのグローバル変数の初期化
ほとんどの場合、NULL に設定します。

いくつかの定数を初期化します
ここでの定数は、PHP 独自の定数の一部です。

Zend エンジンとコア コンポーネントの初期化
ここでの初期化操作には、メモリ管理の初期化、グローバル関数ポインタの初期化、字句解析、構文解析、PHP ソース ファイルの中間コードの割り当てが含まれます。実行された関数ポインタ、複数の HashTable (関数テーブル、定数テーブルなど) の初期化、ini ファイル解析の準備、PHP ソース ファイル解析の準備、組み込み関数、標準定数、GLOBALS グローバル変数の登録など。

php.ini を解析します
php.ini ファイルを読み取り、設定パラメータを設定し、zend 拡張機能をロードし、PHP 拡張機能を登録します。

グローバル操作関数の初期化
ユーザー空間で頻繁に使用されるいくつかのグローバル変数 ($_GET、$_POST、$_FILES など) を初期化します。

静的にビルドされたモジュールと共有モジュールを初期化します (MINIT)
デフォルトでロードされるモジュールを初期化します。
モジュールの初期化は次の操作を実行します。
モジュールを登録モジュールリストに登録します。
各モジュールに含まれる関数を関数テーブルに登録します。

関数とクラスを無効にします

zend_disable_function 関数は、PHP 設定ファイルの disable_functions 変数で表される関数を CG (function_table) 関数テーブルから削除するために呼び出されます。

Zend エンジンをアクティブにする
init_compiler 関数を使用してコンパイラを初期化します。

SAPI をアクティブ化します
sapi_activate 関数を使用して SG (sapi_headers) と SG (request_info) を初期化し、HTTP リクエスト メソッドのコンテンツを設定します。

環境の初期化
ユーザー コントロールで使用する必要があるいくつかの環境変数を初期化します。サーバー環境、リクエストデータ環境等を含みます。

モジュールリクエストの初期化
PHP は、zend_activate_modules 関数を呼び出して module_registry 変数に登録されているすべてのモジュールを走査し、RINIT メソッドを呼び出してモジュールのリクエスト初期化操作を実装します。

ファイル関連のコンテンツを処理した後、PHP は php_request_startup を呼び出してリクエストの初期化操作を実行します。

Zend エンジンをアクティブ化
SAPI をアクティブ化
環境の初期化
module リクエスト初期化

コード実行
以上の準備が完了したら、PHP プログラムの実行を開始します。 PHP は、zend_compile_file を通じて字句解析、構文解析、中間コード生成操作を実行し、このファイルのすべての中間コードを返します。解析されたファイルが有効な中間コードを生成する場合、zend_excute が呼び出されて中間コードが実行されます。 。実行中に例外が発生し、ユーザーがこれらの例外の処理を定義している場合、これらの例外処理関数が呼び出されます。すべての操作が処理された後、PHP は EG (return_value_ptr_ptr) を通じて結果を返します。

DEACTIVATION (Close request)
PHP がリクエストを閉じるプロセスは、いくつかの終了操作のセットであり、このセットは php_request_shutdown 関数内に存在します。これには以下が含まれます:

register_shutdown_function() を通じて登録されたすべての関数を呼び出します。シャットダウン時に呼び出されるこれらの関数はユーザー空間に追加されました。
利用可能なすべての __destruct 関数を実行します。ここでのデストラクタには、オブジェクト プール内のすべてのオブジェクトのデストラクタ (EG (objects_store)) と EG の各要素のデストラクタ メソッド (symbol_table) が含まれます。
すべての出力をフラッシュします。グローバル変数テーブル (PG (http_globals)) の変数を破棄します。
zend_deactivate 関数を使用して、レクサー、パーサー、および中間コード エグゼキューターを閉じます。 基本的に、各拡張 post_deactivate_func 関数ポインターを呼び出します。
SAPI を閉じ、sapi_deactivate を通じて SG (sapi_headers)、SG (request_info) などの内容を破棄します。
メモリ管理をオフにします。最大実行時間



End

PHP がプロセスを終了すると、sapi_flush 関数が呼び出され、内容が更新され、zend_shutdown 関数が呼び出されます。 Zend エンジン

参考: [http://www.php-internals.com/book/](http://www.php-internals.com/book./)

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