如何获得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)
}