VLD是PECL(PHP扩展和应用仓库)的一个PHP扩展,现在最新版本是0.16.0,它的功能是:
显示转储PHP脚本(opcode)的内部显示。简而言之,可以看到PHP程序的OPCODE。
对我们理解PHP内部的运行和优化代码有很大的帮助。
我做的工作就是在此基础上,可以让页面上也能直接看到OPCODE,方便观察,学习。
- 官方地址:http://pecl.php.net/package/vld
- 改造地址:https://github.com/midoks/vld
通用使用
1
2
3
| <?php
phpinfo();
?>
|
- 通过命令行执行结果
- php -dvld.active=1 -dvld.execute=0 info.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| midoksdeMacBook-Pro:demo midoks$ php -dvld.active=1 -dvld.execute=0 info.php
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename: /Users/midoks/Desktop/www/demo/info.php
function name: (null)
number of ops: 3
compiled vars: none
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
3 0 E > INIT_FCALL 'phpinfo'
1 DO_ICALL
5 2 > RETURN 1
branch: # 0; line: 3- 5; sop: 0; eop: 2; out0: -2
path #1: 0,
|
改造使用
改造过程
- 具体过程可以观看源代码,上面都有记录。
- 过程如下:
- 添加设置vld.web。
- 改造vld_printf函数,一旦开始web参数就用php_printf替代stderr输出方式。
- 在vld_dump_fe,vld_dump_cle中,判断是否过滤auto_prepend_file,auto_append_file文件。
如何使用
1
2
3
4
5
| [vld]
extension=vld.so
vld.active=1
vld.skip_prepend=1
vld.skip_append=1
|
1
2
3
4
| [global]
include=/Applications/mdserver/bin/php/php71/etc/php-fpm.d/*.conf
php_value[auto_prepend_file]=/Applications/mdserver/htdocs/md_start.php
php_value[auto_append_file]=/Applications/mdserver/htdocs/md_end.php
|
1
2
3
4
5
| <?php
if (extension_loaded('vld') && isset($_GET['opcode'])) {
ini_set('vld.web', 1);
}
?>
|
使用问题
- 在页面中,使用复杂的程序很容易把php-fpm跑挂。如:wordpress,….你本地玩玩就好。