ホームページ  >  記事  >  バックエンド開発  >  PHPの実行サイクルを詳しく解説

PHPの実行サイクルを詳しく解説

*文
*文オリジナル
2017-12-29 18:52:042129ブラウズ

この記事では、主に 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 &#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;;
?>

実行:

[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, &#39;This+is+a+string&#39;
  7   1 CONCAT                      ~1  !0, &#39;+that+has+been+echoed+on+screen&#39;
     2 ECHO                           ~1
 10  3 RETURN                          1
     4* ZEND_HANDLE_EXCEPTION
This is a string that has been echoed on screen

注: ZEND_HANDLE_EXCEPTION は、Zend/zend の 149 番目の命令です。 _vm_opcodes.h

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の例

簡単な分析PHP の基本的な動作メカニズムと動作原理

以上がPHPの実行サイクルを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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