<?php
$show_value = 123;
echo 'sing_quote'.$show_value;
echo "double_quote{$show_value}";
?>
オペコードは次のとおりです。
1: <?php
2: $show_value = 123;
0 ASSIGN !0, 123
3: echo 'sing_quote'.$show_value;
1 CONCAT 'sing_quote', !0 =>RES[~1]
2 ECHO ~1
4: echo "double_quote{$show_value}";
3 ADD_STRING 'double_quote' =>RES[~2]
4 ADD_VAR ~2, !0 =>RES[~2]
5 ECHO ~2
6 RETURN 1
Vulcan Logic Disassembler PECL拡張機能を確認してください。詳細は 作成者のホームページ を参照してください。
Vulcan Logic DisassemblerはZend Engineにフックし、スクリプトのすべてのオペコード(実行ユニット)をダンプします。それはエンコーダーの始まりとして書かれましたが、そのための時間はありませんでした。 Zend Engineで何が起こっているかを確認するために使用できます。
インストールしたら、次のように使用できます。
php -d vld.active=1 -d vld.execute=0 -f yourscript.php
この オペコード抽出に関する興味深いブログ投稿 と 利用可能なオペコードをリストするPHPマニュアルページ も参照してください。
Parsekit には parsekit_compile_string() があります。
Sudo pecl install parsekit
var_dump(parsekit_compile_string(<<< PHP \$ show_value = 123; echo 'sing_quote'。\ $ show_value; echo "double_quote {\ $ show_value } "; PHP ));
出力は非常に冗長であるため、アセンブラのような形式にするには、出力を処理する必要があります。
["opcodes"] => array(10){ [0] => array(9){ ["アドレス"] => int(44682716) [" opcode "] => int(101) [" opcode_name "] => string(13) "ZEND_EXT_STMT" ["flags"] => int(4294967295) ["result"] => array(8) { ["type"] => int(8) ["type_name"] => string(9) "IS_UNUSED" ["var"] => int(0) ["opline_num"] => string(1) "0" ["op_array" ] => string(1) "0" ["jmp_addr"] => string(1) "0" ["jmp_offset"] = > string(8) "35419039" ["EA.type"] => int(0) } ["op1 "] => array(8){ [" type "] => int(8) [" type_name "] => string(9) "IS_UNUSED" ["var"] => int(0) ["opline_num"] => string(1) "0" [ "op_array"] => string(1) "0" ["jmp_addr"] => string(1) "0" ["jmp_offset "] => string(8)" 35419039 " [" EA.type "] => int(0) }