如何获取 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 的操作码?的主要内容,如果未能解决你的问题,请参考以下文章