PHP原理の実行サイクル例の分析

墨辰丷
リリース: 2023-03-29 11:20:01
オリジナル
1717 人が閲覧しました

この記事では、主に 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 &#39;hello, world.&#39;;
?>
ログイン後にコピー

実行:

[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                           &#39;hello%2C+world.&#39;
  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. &#39; that has been echoed on screen&#39;;
?>
ログイン後にコピー

:

りー

注: 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 サイトの他の関連記事を参照してください。

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