如何获得PHP的操作码?


73
  <?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

13
哇,什么问题!
毛里斯

9
谁投票“不是一个真正的问题”?这是一个很好的问题!
保罗·迪克森

他们投票支持不是真正的问题,因为对他们而言,这超出了他们的关注范围。
Deep Kakkar'3

Answers:


42

查看Vulcan Logic Disassembler PECL扩展-有关更多信息,请参见作者的主页

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

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

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

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


@Paul Dixon,您如何知道php之后的命令:“ -d vld.active = 1 -d vld.execute = 0 -f”我查看了pecl vld,但没有相关文档。谢谢你的放心。
星光

请参阅帖子中的第二个链接。
保罗·迪克森

12

Parsekit具有parsekit_compile_string()

sudo pecl install parsekit
var_dump(parsekit_compile_string(<<< PHP
 \ $ show_value = 123;
 回显'sing_quote'。\ $ show_value;
 回声“ double_quote {\ $ show_value}”;
的PHP
));

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

  [“操作码”] =>
  数组(10){
    [0] =>
    数组(9){
      [“地址”] =>
      整数(44682716)
      [“操作码”] =>
      整数(101)
      [“ opcode_name”] =>
      字符串(13)“ ZEND_EXT_STMT”
      [“标志”] =>
      整数(4294967295)
      [“结果”] =>
      array(8){
        [“类型”] =>
        整数(8)
        [“ type_name”] =>
        字符串(9)“ IS_UNUSED”
        [“ var”] =>
        整数(0)
        [“ opline_num”] =>
        字符串(1)“ 0”
        [“ op_array”] =>
        字符串(1)“ 0”
        [“ jmp_addr”] =>
        字符串(1)“ 0”
        [“ jmp_offset”] =>
        字符串(8)“ 35419039”
        [“ EA.type”] =>
        整数(0)
      }
      [“ op1”] =>
      array(8){
        [“类型”] =>
        整数(8)
        [“ type_name”] =>
        字符串(9)“ IS_UNUSED”
        [“ var”] =>
        整数(0)
        [“ opline_num”] =>
        字符串(1)“ 0”
        [“ op_array”] =>
        字符串(1)“ 0”
        [“ jmp_addr”] =>
        字符串(1)“ 0”
        [“ jmp_offset”] =>
        字符串(8)“ 35419039”
        [“ EA.type”] =>
        整数(0)
      }

1
您拼错了命令。应该是“ sudo pecl install parsekit”。
MikeSchinkel 2012年

不相容于PHP 5.4 :(
阿利克斯阿克塞尔

1
Bug的主题是与PHP 5.4的parsekit不兼容bugs.php.net/bug.php?id=61187 Remi collet有一个补丁(虽然我没有对其进行测试)github.com/remicollet/remirepo/blob/master / php / pecl /…
Antoine'hashar'Musso 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.