78
  <?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
4

2 回答 2

45

查看Vulcan Logic Disassembler PECL 扩展 - 请参阅作者的主页了解更多信息。

Vulcan Logic Disassembler 连接到 Zend 引擎并转储脚本的所有操作码(执行单元)。它是作为编码器的开始而编写的,但我从来没有时间这样做。它可以用来查看 Zend 引擎中发生了什么。

安装后,您可以像这样使用它:

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

另请参阅这篇关于操作码提取的有趣博客文章,以及列出可用操作码的 PHP 手册页

于 2009-11-25T08:28:15.097 回答
13

Parsekitparsekit_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
));

输出非常冗长,因此您需要对其进行处理以获得类似汇编程序的格式。

  [“操作码”]=>
  数组(10){
    [0]=>
    数组(9){
      [“地址”]=>
      整数(44682716)
      [“操作码”]=>
      整数(101)
      [“操作码名称”]=>
      字符串(13)“ZEND_EXT_STMT”
      [“标志”]=>
      整数(4294967295)
      [“结果”]=>
      数组(8){
        [“类型”]=>
        整数(8)
        [“类型名称”]=>
        字符串(9)“IS_UNUSED”
        [“变量”]=>
        整数(0)
        [“opline_num”]=>
        字符串(1)“0”
        ["op_array"]=>
        字符串(1)“0”
        ["jmp_addr"]=>
        字符串(1)“0”
        ["jmp_offset"]=>
        字符串(8)“35419039”
        ["EA.type"]=>
        整数(0)
      }
      [“op1”]=>
      数组(8){
        [“类型”]=>
        整数(8)
        [“类型名称”]=>
        字符串(9)“IS_UNUSED”
        [“变量”]=>
        整数(0)
        [“opline_num”]=>
        字符串(1)“0”
        ["op_array"]=>
        字符串(1)“0”
        ["jmp_addr"]=>
        字符串(1)“0”
        ["jmp_offset"]=>
        字符串(8)“35419039”
        ["EA.type"]=>
        整数(0)
      }
于 2012-02-28T12:09:11.497 回答