php7最小化安装 && vld扩展安装并查看php代码的opcode && ast测试

最小化安装php7

cd ~/software/

git clone https://github.com/php/php-src.git

cd php-src

git checkout php-7.2.13

cd ../

cp  -r php-src php7.2

cd php7.2

./buildconf --force

./configure --prefix={家目录}/software/temp/php7  --disable-all

make && make install 

核心模块:Core date ereg pcre Reflection SPL standard

较php5多出一个ereg模块,且bin目录下多了phpdbg可执行文件

 

安装vld

git clone https://github.com/derickr/vld.git

cd vld

~/software/temp/php7/bin/phpize

./configure --with-php-config={家目录}/software/temp/php7/bin/php-config --enable-vld

make && make install

cd ~/software/temp/php7/lib

touch php.ini

echo 'extension=vld.so' > php.ini

~/software/temp/php7/bin/php -m | grep vld 如果在输出的结果能看到vld,则说明vld扩展启用成功。

 

测试vld生成opcode

cd ~/software/temp/php7

mkdir test

cd test

touch vld.php

输入如下代码:

<?php

$str = 'hello world';

var_dump($str);

执行如下命令查看上述php代码的opcode:

~/software/temp/php7/bin/php -dvld.active=1 vld.php

执行结果如下:

Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /home/leon/software/temp/php7/test/vld.php
function name:  (null)
number of ops:  5
compiled vars:  !0 = $str
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   ASSIGN                                                   !0, 'hello+world'
   3     1        INIT_FCALL                                               'var_dump'
         2        SEND_VAR                                                 !0
         3        DO_ICALL                                                 
   4     4      > RETURN                                                   1

branch: #  0; line:     2-    4; sop:     0; eop:     4; out0:  -2
path #1: 0, 
string(11) "hello world"

图形化调用结果

安装dot

sudo apt-get install graphviz

~/software/temp/php7/bin/php -dvld.active=1 -dvld.save_paths=1 vld.php

dot -Tpng /tmp/paths.dot -o paths.png

结果如下:

测试token_get_all

需要先安装tokenizer扩展,安装步骤同vld安装步骤

<?php
$tokens = token_get_all('<?php echo; ?>');

foreach ($tokens as $token) {
    if (is_array($token)) {
        echo "Line {$token[2]}: ", token_name($token[0]), " ('{$token[1]}')", PHP_EOL;
    }
}
?>

php执行后结果为:

Line 1: T_OPEN_TAG ('<?php ')
Line 1: T_ECHO ('echo')
Line 1: T_WHITESPACE (' ')
Line 1: T_CLOSE_TAG ('?>')
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值