VLD是PECL(PHP扩展和应用仓库)的一个PHP扩展,现在最新版本是0.16.0,它的功能是: 显示转储PHP脚本(opcode)的内部显示。简而言之,可以看到PHP程序的OPCODE。 对我们理解PHP内部的运行和优化代码有很大的帮助。 我做的工作就是在此基础上,可以让页面上也能直接看到OPCODE,方便观察,学习。

  • 官方地址:http://pecl.php.net/package/vld
  • 改造地址:https://github.com/midoks/vld

通用使用

  • 先准备一段测试代码[info.php]
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文件。

如何使用

  • 设置php.ini
1
2
3
4
5
[vld]
extension=vld.so
vld.active=1
vld.skip_prepend=1
vld.skip_append=1
  • 设置php-fpm.conf
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
  • 设置md_start.php
1
2
3
4
5
<?php
if (extension_loaded('vld') && isset($_GET['opcode'])) {
	ini_set('vld.web', 1);
}
?>

使用问题

  • 在页面中,使用复杂的程序很容易把php-fpm跑挂。如:wordpress,….你本地玩玩就好。