web-dev-qa-db-ja.com

PHPのオペコードを取得するには?

  <?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
72
Mask

Vulcan Logic Disassembler PECL拡張機能を確認してください。詳細は 作成者のホームページ を参照してください。

Vulcan Logic DisassemblerはZend Engineにフックし、スクリプトのすべてのオペコード(実行ユニット)をダンプします。それはエンコーダーの始まりとして書かれましたが、そのための時間はありませんでした。 Zend Engineで何が起こっているかを確認するために使用できます。

インストールしたら、次のように使用できます。

php -d vld.active=1 -d vld.execute=0 -f yourscript.php

この オペコード抽出に関する興味深いブログ投稿利用可能なオペコードをリストするPHPマニュアルページ も参照してください。

40
Paul Dixon

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)
} 
12
Kornel