# 性能分析 - Vld

## Vld

## 简介

vld是PECL（PHP 扩展和应用仓库）的一个PHP扩展，现在最新版本是 0.14.0（2016-12-18），它的作用是：显示转储PHP脚本（opcode）的内部表示（来自PECL的vld简介）。简单来说，可以查看PHP程序的opcode。

vld(Vulcan Logic Dumper)是一个在Zend引擎中，以挂钩的方式实现的用于输出PHP脚本生成的中间代码（执行单元）的扩展。 它可以在一定程序上查看Zend引擎内部的一些实现原理，是我们学习PHP源码的必备良器。它的作者是Derick Rethans, 除了VLD扩展，我们常用的XDebug扩展的也有该牛人的身影。

pecl地址：<https://pecl.php.net/package/vld>

## 安装

### 方式1：源代码安装：[参考地址](http://www.cnblogs.com/miao-zp/p/6374311.html)

### 方式2：pecl 方式安装

版本：

```
Ubuntu 14.04.3 LTS \n \l
PHP 7.1.5-1
```

安装过程：

最新版本可以去pecl查看，运行一下命令：

```
$ sudo pecl install channel://pecl.php.net/vld-0.14.0
```

安装完成后显示以下结果：

```
Build process completed successfully
Installing '/usr/lib/php/20160303/vld.so'
install ok: channel://pecl.php.net/vld-0.14.0
configuration option "php_ini" is not set to php.ini location
You should add "extension=vld.so" to php.ini
```

添加将扩展加入到php.ini中

```
$ cd /etc/php/7.1/mods-available
$ touch vld.ini     #将划线以下的部分添加到文件中
-------------------
; configuration for php VLD module 
; ; priority=20 
extension=/usr/lib/php/20160303/vld.so
```

做软链接

```
$ cd /etc/php/7.1/cli/conf.d/
$ sudo  ln -s  ../../mods-available/vld.ini 20-vld.ini
$ cd /etc/php/7.1/apache2/conf.d/
$ sudo  ln -s  ../../mods-available/vld.ini 20-vld.ini
```

重启查看phpinfo信息即可

![](/files/-LfnTEJV0R2SMMosBdu7)

## 使用

新建两个php文件,输出一个用 . ，一个用 , 连起来

* 1.php

```php
<?php echo "Hello"." "."world!" ?>
```

* 2.php

```php
<?php echo "Hello"," ","world!" ?>
```

分别开启两个终端，在cli命令行下执行

```
$ php -dvld.active=1 1.php
```

结果：

```
Finding entry points
Branch analysis from position: 0
Jump found. (Code = 62) Position 1 = -2
filename:       /home/revin/work/code/test/1.php
function name:  (null)
number of ops:  5
compiled vars:  none
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   1     0  E >   EXT_STMT                                                 
         1        ECHO                                                     'Hello+world%21'
         2        EXT_STMT                                                 
         3        ECHO                                                     '++'
         4      > RETURN                                                   1

branch: #  0; line:     1-    1; sop:     0; eop:     4; out1:  -2
path #1: 0, 
Hello world!
```

```
$ php -dvld.active=1 2.php
```

## 结果：

```
Finding entry points
Branch analysis from position: 0
Jump found. (Code = 62) Position 1 = -2
filename:       /home/revin/work/code/test/2.php
function name:  (null)
number of ops:  9
compiled vars:  none
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   1     0  E >   EXT_STMT                                                 
         1        ECHO                                                     'Hello'
         2        EXT_STMT                                                 
         3        ECHO                                                     '+'
         4        EXT_STMT                                                 
         5        ECHO                                                     'world%21'
         6        EXT_STMT                                                 
         7        ECHO                                                     '++'
         8      > RETURN                                                   1

branch: #  0; line:     1-    1; sop:     0; eop:     8; out1:  -2
path #1: 0, 
Hello world!
```

## 参数

```
-dvld.active 是否在执行PHP时激活VLD挂钩，默认为0，表示禁用。可以使用-dvld.active=1启用。
-dvld.skip_prepend 是否跳过php.ini配置文件中auto_prepend_file指定的文件， 默认为0，即不跳过包含的文件，显示这些包含的文件中的代码所生成的中间代码。此参数生效有一个前提条件：-dvld.execute=0
-dvld.skip_append 是否跳过php.ini配置文件中auto_append_file指定的文件， 默认为0，即不跳过包含的文件，显示这些包含的文件中的代码所生成的中间代码。此参数生效有一个前提条件：-dvld.execute=0
-dvld.execute 是否执行这段PHP脚本，默认值为1，表示执行。可以使用-dvld.execute=0，表示只显示中间代码，不执行生成的中间代码。
-dvld.format 是否以自定义的格式显示，默认为0，表示否。可以使用-dvld.format=1，表示以自己定义的格式显示。这里自定义的格式输出是以-dvld.col_sep指定的参数间隔
-dvld.col_sep 在-dvld.format参数启用时此函数才会有效，默认为 “\t”。
-dvld.verbosity 是否显示更详细的信息，默认为1，其值可以为0,1,2,3 其实比0小的也可以，只是效果和0一样，比如0.1之类，但是负数除外，负数和效果和3的效果一样 比3大的值也是可以的，只是效果和3一样。
-dvld.save_dir 指定文件输出的路径，默认路径为/tmp。
-dvld.save_paths 控制是否输出文件，默认为0，表示不输出文件
-dvld.dump_paths 控制输出的内容，现在只有0和1两种情况，默认为1,输出内容
```

## 资料

[PHP性能之语言性能优化：vld——查看代码opcode的神器](http://www.cnblogs.com/miao-zp/p/6374311.html)

[VLD扩展使用指南](http://www.phppan.com/2011/05/vld-extension/)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://php7.shujuwajue.com/phpff17-diao-shi/xing-neng-fen-xi-vld.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
