ホームページ > バックエンド開発 > PHPチュートリアル > PHPインタープリタエンジン実行処理

PHPインタープリタエンジン実行処理

WBOY
リリース: 2016-06-13 13:12:35
オリジナル
1020 人が閲覧しました

PHPインタープリタエンジン実行処理

??? ここでは、cli SAPI を例として、一部の初期化とクリーンアップ操作を省略して、PHP スクリプトを実行するプロセスを紹介します。
??? CLI (コマンド ライン インターフェイス) は PHP のコマンド ライン モードです。PHP をサーバーにインストールすると、通常、このファイルが生成されます。 usr /local/bin/php の場合、次のコマンドを使用して、SHELL で PHP スクリプトを実行できます:
/usr/local/bin/php -f test.php
このコマンドは、現在の環境でテストを実行します。ディレクトリ .php スクリプトについては、今のところ test.php の特定の内容は気にせず、この実行の内部プロセスのみを気にします。


????? CLI のメインのソース コード ファイルは、{PHPSRC}/sapi/cli/php_cli.c にあります。このファイル内の main() 関数からプロセス全体が実行されます。メインは次の段階に分けることができます:
1: コマンドラインパラメータを解析します
2: 環境を初期化します
3: PHP コードをコンパイルして実行します
4: 環境をクリーンアップしますそして終了

に戻ります


最初の段階では、-f パラメーターが解析されて PHP ファイルが実行されます。-f の後の test.php が実行する必要があるファイルです。
ここでは 3 番目の段階に焦点を当てます。 、test.phpのPHPコードを実行する方法。
最終的に、PHP スクリプトは php_execute_script(&file_handle TSRMLS_CC) を通じて実行されます。この関数は {PHPSRC}/main/main.c で定義されており、プロトタイプは次のとおりです:
PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC)?
file_handle のタイプは zend_file_handle で、これは zend によるファイル ハンドルのカプセル化であり、内部のコンテンツは test.php に関連しています。

php_execute_script は最終的に zend_execute_scripts を呼び出します。この関数は {PHPSRC}/Zend/zend.c で定義されており、プロトタイプは次のとおりです:
ZEND_API int zend_execute_scripts(int type TSRMLS_DC, zval **retval, int file_count, ..)?
この関数には可変パラメータがあり、一度に複数の PHP ファイルを実行できます。

zend_compile_file は関数ポインタであり、{PHPSRC}/Zend/zend_compile.c:
ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC);? で宣言されています。この宣言により、compile_file 関数のアドレスが zend_compile_file に割り当てられ、この関数は zend_file_handle ポインタをパラメータとして受け取り、 zend_op_array。


zend_execute も関数ポインターであり、{PHPSRC}/Zend/zend_execute.c:
ZEND_API extern void (*zend_execute)(zend_op_array *op_array TSRMLS_DC);
でも宣言されています。エンジンの初期化 の場合、実行関数のアドレスは zend_execute に割り当てられ、実行は {PHPSRC}/Zend/zend_vm_execute.h で定義されます。
宣言により、zend_execute が zend_op_array 構造体へのポインタをパラメータとして受け取ることがわかります。このポインタは、op_array の実行中に zend_compile_file 内の op コードの実行を開始します。には、PHP言語が実装されており、さまざまな機能が搭載されています。

?

主な実行作業は基本的にここで完了します。

追記:

??? なぜ zend_execute と zend_compile_file を関数ポインターとして定義するのでしょうか?

??? エンジンの初期化 (zend_startup) 中に、zend_execute はデフォルトの実行ファイルを指し、zend_compile_file はデフォルトのcompile_file を指します。実際のコンパイルと実行の前に、zend_execute と zend_compile_file を他のコンパイル関数と実行関数に書き換えることができます。これにより、よく知られた拡張機能 vld (http://www.derickrethans.nl/projects.html) など、エンジンを拡張するためのフックが残ります。 #vld)、この拡張機能は、リクエストごとに初期化されるフック関数 (PHP_RINIT_FUNCTION) 内の zend_execute と zend_compile_file を独自の vld_execute と vld_compile_file に置き換えます。これら 2 つの関数は実際にはオリジナルの関数をカプセル化し、オペコード情報を出力する追加関数です。エンジンの初期化はモジュール リクエストの初期化の前に行われ、モジュール リクエストの初期化はコンパイルと実行の前に行われるため、このようなカバレッジは目的を達成できます。

?

?

元のアドレス: http://blog.csdn.net/phpkernel/article/details/5716342

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート