如何获取 PHP 的操作码?

Posted

技术标签:

【中文标题】如何获取 PHP 的操作码?【英文标题】:How to get opcodes of PHP? 【发布时间】:2010-12-20 04:57:55 【问题描述】:
  <?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

【问题讨论】:

哇,真是个问题! 谁投票“不是一个真正的问题”?这是一个很好的问题! 谁投票给了不是真正的问题,因为对他们来说这超出了他们的关注范围。 【参考方案1】:

查看Vulcan Logic Disassembler PECL 扩展 - 请参阅author's home page 了解更多信息。

Vulcan Logic Disassembler 钩子 进入 Zend 引擎并转储所有 脚本的操作码(执行单元)。 它被写成一个开始 编码器,但我从来没有时间 那。它可以用来查看是什么 在 Zend 引擎中进行。

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

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

另请参阅 interesting blog post on opcode extraction 和 PHP manual page listing the available opcodes。

【讨论】:

@Paul Dixon 你是怎么知道 php 之后的命令的:“-d vld.active=1 -d vld.execute=0 -f” 我看了看 pecl vld 并且有没有文档。提前谢谢你。 查看帖子中的第二个链接。【参考方案2】:

Parsekit 拥有parsekit_compile_string()。

sudo pecl install parsekit
var_dump(parsekit_compile_string(

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

[“操作码”]=> 数组(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)

【讨论】:

与 PHP 5.4 不兼容 :(. parsekit 与 PHP 5.4 的不兼容是错误的主题bugs.php.net/bug.php?id=61187 Remi collet 有一个补丁(虽然我还没有测试过)github.com/remicollet/remirepo/blob/master/php/pecl/…

以上是关于如何获取 PHP 的操作码?的主要内容,如果未能解决你的问题,请参考以下文章

php 如何获取客户端唯一标识?

如何使用 jQuery 获取 HTTP 状态码?

PHP中基于位掩码获取数组值

delphi中的webbrowser ,如何获取网站返回状态码

如何获取运行 PHP 的操作系统?

如何才能获取到http的响应状态码