如何获得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
查看Vulcan Logic Disassembler PECL扩展 – 查看作者的主页获取更多信息。
Vulcan Logic Disassembler挂接到Zend Engine并转储脚本的所有操作码(执行单元)。 它被写为一个编码器的开始,但我从来没有这个时间。 它可以用来查看Zend引擎中发生了什么。
一旦安装,你可以像这样使用它:
php -d vld.active=1 -d vld.execute=0 -f yourscript.php
另请参阅有关操作码抽取的有趣博客文章 ,以及列出可用操作码的PHP手册页 。
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 ));
输出是非常详细的,所以你需要处理它得到类似汇编的格式。
[ “操作码”] => 数组(10){ [0] => 数组(9){ [ “地址”] => INT(44682716) [ “操作码”] => INT(101) [ “opcode_name”] => string(13)“ZEND_EXT_STMT” [ “标志”] => INT(4294967295) [ “结果”] => 数组(8){ [ “型”] => 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”] => 数组(8){ [ “型”] => 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) }