vld 扩展安装

  在学习和研究PHP的过程中,总会需要查看opcodes,可以使用PHP自带的phpdbg命令进行查看,也可以通过vld扩展进行查看。
a.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
$a = 1;
echo $a;

/*phpdbg查看OPCode如下:
phpdbg -p* a.php
function name: (null)
L1-4 {main}() /root/PHPSourceCode/a.php - 0x7f0962c780a0 + 5 ops
L2 #0 EXT_STMT
L2 #1 ASSIGN $a 1
L3 #2 EXT_STMT
L3 #3 ECHO $a
L4 #4 RETURN 1

vld查看OPCode如下:
php -d vld.active=1 a.php
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename: /root/PHPSourceCode/a.php
function name: (null)
number of ops: 5
compiled vars: !0 = $a
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > EXT_STMT
1 ASSIGN !0, 1
3 2 EXT_STMT
3 ECHO !0
4 4 > RETURN 1

branch: # 0; line: 2- 4; sop: 0; eop: 4; out0: -2
path #1: 0,

  vld扩展安装如下:

1
2
3
4
5
git clone https://github.com/derickr/vld.git
cd vld
./configure --with-php-config=/usr/local/php/bin/php-config --enable-vld
make
make install

  安装成功后通过php --ini找到php.ini配置文件加入extension=vld.so,重启php-fpm,可以通过php -m | grep vld来查看是否安装完成,然后就可以使用vld来查看PHP执行的opcodes了。
  vld常用扩展参数说明:

vld.active:是否激活vld,默认是0(不激活),1(激活)
vld.execute :是否输出执行结果,默认是1(输出),0(不输出)
vld.verbosity:是否输出更详细的opcodes,大于等于3和小于0是(输出op1、op2、result),0,1,2效果一样不输出op1、op2、result,默认1
vld.save_dir:指定文件输出路径,默认为/tmp
vld.save_paths:控制是否输出dot语言文件,默认0(不输出),1(输出)

  dot是一种图形描述语言,由graphviz工具绘制:
Vld.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
class Vld
{
public $num;
public function __construct($num)
{
$this->num = $num;
}
public function increase()
{
return $this->num + 1;
}
}
$v = new Vld(1);
var_dump($v->increase());

  执行 php -dvld.active=1 -dvld.save_paths=1 vld.php
  进入/tmp目录,执行 dot -Tpng /tmp/paths.dot -o paths.png 生成如下图片:
Vld.png
  这里扩展一下,使用 graphviz 还可以画流程图哦,很高大上吧,下面一起来看看吧。graphviz 官方下载地址
demo.dot

1
2
3
4
5
6
7
digraph demo {
start [label="start"]
op [label="enter" shape=box]
end [label="end"]

start->op->end
}

  执行 dot -Tpng demo.dot -o demo.png 就可以得到如下流程图:
demo.png