この記事では、主に PHP の原則の実行サイクルについて詳しく説明します。編集から字句解析、構文解析、解釈の実行まで、PHP プログラムの関連原則を簡単に分析します。必要な方は、
PHP を参照してください。最初に作成した PHP スクリプトから実行結果を取得するまで、このプロセスは実際には次の段階に分かれています。
まず、Zend Engine (ZE) は字句アナライザー (Lex によって生成され、ソース ファイルは Zend/zend_ language_sanner.l にあります) を使用して、実行する PHP ソース ファイルからスペースとコメントを削除し、1 つずつトークンに分割します。
その後、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'; ?>
:
りー 注: ZEND_HANDLE_EXCEPTION は Zend/zend_vm_opcodes.h の 149 番目の命令ですcompiled vars: !0 = $i これは !0 (*zval) から取得された変数名 "i" です。
#0 文字列 "this+is+a+string" を !0 に代入#1 文字列接続
#2 表示
これらの中間コードは、Zend VM (Zend 仮想マシン) によって直接実行されます。実際に実行を担当する関数は zend_execute (zend_execute.h) です。
要約: 上記がこの記事の全内容です。皆様の学習に役立つことを願っています。
関連する推奨事項:
PHP を使用してページ内の URL を定期的にキャプチャする方法PHP に基づいた ID カード検証コード計算メソッドの実装ロックを使用してコード取得ベースを実現するPHP の関数メソッド以上がPHP原理の実行サイクル例の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。