Opcondes は、Java のバイト コードや .NET の MSL と同様に、PHP スクリプトからコンパイルされた中間言語です。 (理解できませんでした~)
記事の例をあげてください
コードをコピーしてください コードは次のとおりです:
echo "Hello World";
$a = 1 1;
PHP はこのコードを実行します 次の 4 つの手順を経た後 (正確には PHP の言語エンジン Zend のはずです)
コードをコピー コードは次のとおりです。
1.スキャン (字句解析) (スキャン)、PHP コードを言語フラグメント (トークン) に変換します 2. 解析 (文法分析)、トークンを単純で意味のある表現に変換します
3 .Compilation (コンパイル)、式を Opocdes
にコンパイルします。 4.Execution (コンパイル結果を実行)、Opcode を 1 つずつ順番に実行することで、PHP スクリプトの機能を実現します。
その中で、彼は次のようにも述べています:「APC などの一部のキャッシュでは、PHP がオペコードをキャッシュできるようになりました。この方法では、リクエストが来るたびに、以前のキャッシュを繰り返す必要がなくなります。これは、PHP の実行速度を大幅に向上させることができます。これが、PHP の実行速度が速くなる理由の 1 つかもしれません ~
コードをコピー コードは次のとおりです:
配列(
[0] => 配列
(
[0] => 367
[1] => 配列
(
[0] => 316
[1] => echo
)
[2] => 配列
( <🎜; >[0] = > 370
[1] =>
)
[3] => 配列
(
[0] => 315
[1] = > " Hello World"
)
[4] =>
[5] => 配列
(
[0] => ; =>
)
[6] => =
[7] => 配列
(
[0] => 370
[1] => )
[8] => 配列
(
[0] => 305
[1] => 1
)
[9] => 配列
(
[0] => 370
[1] =>
)
[10] => 🎜>[0] => 370
[1] => 1] => ; 1
)
[13] => ;
[14] => 配列
(
[0] => 370
[1] =>
)
[15] => ] => 配列
(
[0] => 370
[1] =>
)
[17] => ;
)
この戻り結果を分析すると、ソース コード内の文字列、文字、スペースが変更されずに返されることがわかります。各ソース コード内の文字は、対応する順序で表示されます。ただし、タグ、演算子、ステートメントなどの他の項目は、トークン ID (つまり、T_ECHO、T_STRING など、Zend 内のトークンを変更するための対応するコード) と元のコードの 2 つの部分を含む配列に変換されます。ソースコード。
次に、解析段階になります。解析では、まずトークン配列内の余分なスペースが破棄され、次に残りのトークンが 1 つずつ単純な式に変換されます。
コードをコピーします。 🎜>
コードは次のとおりです。
1. 定数文字列をエコーします
2. 2 つの数値を加算します
3. 前の式の結果を変数に保存します
4.変数
次に、トークンを 1 つずつ op_array にコンパイルします。
コードは次のとおりです: 1. オペコード番号の識別は、add、echo 2. 結果にはオペコードの結果が格納されます 3. オペコード
のオペランド 1 オペランド 25. オーバーロードされた演算子を区別するために使用される拡張値 1 の整数
たとえば、PHP コードは次のように解析されます:
* ZEND_ECHO 'Hello World ' * ZEND_ADD ~0 1 1 * ZEND_ASSIGN !0 ~0
* ZEND_ECHO !0
ははは、私たちの $a はどこに行ったのかと疑問に思うかもしれません。
これはオペランドについてです。各オペランドは次の 2 つの部分で構成されます。
a)op_type: IS_CONST、IS_TMP_VAR、IS_VAR、IS_UNUSED、または IS_CVb) u、共用体、 op_type に応じて、オペランドの値 (const) または lvalue (var) を異なる型で格納します。var の場合、各 var は異なります。
IS_TMP_VAR は、名前が示すように、一部の値を保存する一時変数です。次の op_array で使用する op_array の結果。このタイプのオペランドの u には、変数テーブルを指すハンドル (整数) が格納されます。~0 などの先頭は、不明な一時変数を表します。変数テーブル
IS_VAR の 0 番。これらは一般的な意味での変数であり、$ で始まり、
IS_CV は PHP5 以降のコンパイラーで使用される ZE2.1 キャッシュ メカニズムを表します。 .1. この変数には、変数が初めて参照されるとき、その変数は CVd され、アクティブなシンボル テーブルを再度参照する必要がなくなります。 、CV変数に!始まりはそれを示しています。
$a は !0 に最適化されているようです。
概要:
1.php の実行順序は次のとおりです: -> php プログラム
--> スキャン (スキャンとトークン (言語フラグメント) への変換)
-> 解析 (文法解析、トークンを単純で意味のある式に変換)
-> コンパイル (コンパイル、式を Opocdes (オペレーション コード) にコンパイル)
-> 実行 (逐次実行) 2. APC (Alternative PHP Cache) のキャッシュ メカニズムにより、次回リクエストが来たときに、前の 3 つの手順を繰り返す必要がなく、PHP の実行速度が大幅に向上します。 。 これが、PHP の実行速度が速くなる理由の 1 つである可能性があります
補足:
apc、zend 最適化は、オペコードをキャッシュできるため、PHP を高速化できます
は、zend エンジン自体の組み込み関数ではありません
zend エンジンは、転生のすべてのアイテムにデフォルトで設定されます。