この記事では、主に PHP 原則の実行サイクルについての深い理解を紹介し、編集から字句解析、構文解析、解釈と実行に至るまで、PHP プログラムの関連原則を簡単に分析します。お役に立てれば幸いです。
詳細は次のとおりです。
最初に作成した PHP スクリプトから、実行される最終スクリプトまで、このプロセスは実際には次の段階に分かれています。 :
まず、Zend Engine (ZE) は字句アナライザー (Lex によって生成され、ソース ファイルは Zend/zend_langage_sanner.l にあります) を呼び出し、実行する PHP ソース ファイルからスペースとコメントを削除し、トークンに分割します。一つずつ。
その後、ZE は取得したトークンを構文アナライザー (yacc によって生成され、ソース ファイルは Zend/zend_ language_parser.y にあります) に転送し、オペコードを 1 つずつ生成します。オペコードは通常、op 配列の形式で存在します。 PHP中間言語で実行されます。
最後に、ZEはzend_executorを呼び出してop配列を実行し、結果を出力します。 (つまり、ソースファイルを機械語に変換して、仮想マシン上で実行するということです。)
ZE は仮想マシンであるからこそ、動作を全く考えずに PHP スクリプトを書くことができます。システム タイプとは何ですか? これが PHP を移植可能にするものです。 ZE は CISC (複雑な命令プロセッサ) であり、最も単純な ZEND_ECHO (エコー) から複雑な ZEND_INCLUDE_OR_EVAL (include、require) までを含む 150 の命令をサポートします (具体的な命令は Zend/zend_vm_opcodes.h にあります)。書かれた内容は、最終的にこれら 150 個の命令 (オペコード) のシーケンスに処理され、最終的に実行されます。 PHP はスクリプト言語です。つまり、ユーザーが作成した PHP コードは、最終的には PHP インタープリターによって解釈され、実行され、PHP 仮想マシンの仮想命令 (OPCODES) に変換されます。実行するZE。
では、PHP スクリプトは最終的に何に「翻訳」されるのでしょうか? 言い換えれば、オペコードはどのようなものになるでしょうか?
オペコードは、PHP スクリプトからコンパイルされた中間言語です。 PECL にはすでにそのようなモジュールがあり、Derick Rethans によって開発された VLD (Vulcan Logic Dissassembler) モジュールを利用しています。このモジュールをダウンロードしてPHPに読み込むだけで、簡単な設定でスクリプトの翻訳結果を得ることができます。
VLD モジュールのインストールとアプリケーション:
[root@localhost software]# tar zxvf vld-0.9.1.tgz.gz [root@localhost vld-0.9.1]# /usr/local/php/bin/phpize [root@localhost vld-0.9.1]# ./configure --with-php-config=/usr/local/php/bin/php-config [root@localhost vld-0.9.1]# make install //不需要make
php.ini ファイルを編集し、vld 拡張機能を有効にします。
例:
次のようなファイルを作成します: hello.php
<?php echo 'hello, world.'; ?>
実行:
[root@localhost html]# /usr/local/php/bin/php -dvld.active=1 hello.php Branch analysis from position: 0 Return found filename: /var/www/html/hello.php function name: (null) number of ops: 3 compiled vars: none line # op fetch ext return operands ------------------------------------------------------------------------------- 2 0 ECHO 'hello%2C+world.' 4 1 RETURN 1 2* ZEND_HANDLE_EXCEPTION hello, world.
別のものを見てください:
[root@localhost html]# vi vld.php <?php $i = "This is a string"; //I am comments echo $i. ' that has been echoed on screen'; ?>
実行:
[root@localhost html]# /usr/local/php/bin/php -dvld.active=1 vld.php Branch analysis from position: 0 Return found filename: /var/www/html/vld.php function name: (null) number of ops: 5 compiled vars: !0 = $i line # op fetch ext return operands ------------------------------------------------------------------------------- 3 0 ASSIGN !0, 'This+is+a+string' 7 1 CONCAT ~1 !0, '+that+has+been+echoed+on+screen' 2 ECHO ~1 10 3 RETURN 1 4* ZEND_HANDLE_EXCEPTION This is a string that has been echoed on screen
compiled vars: !0 = $i !0 (*zval) から取得した変数名 "i" を示します。
#0 文字列 "this+is+a+string" を !0 に代入#1 文字列接続
#2 表示
これらの中間コードは、Zend VM (Zend 仮想マシン) によって直接実行されます。実際に実行を担当する関数は zend_execute (zend_execute.h) です。
以上がPHPの実行サイクルを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。