debian安装vld来查看Opcode,PHP调优。

来源:互联网 发布:莆田电商软件 编辑:程序博客网 时间:2024/06/06 17:48

一: 我的环境: 

Debian 7 (wheezy)  x64  

PHP 5.4.4-14 (apt-get 而来)

Apache/2.2.22 (同上,非源码编译)


二 :安装vld. (# 代表是root下,下面不再说明. wget过来的是0.11.2的版本)

首先我用pecl install channel://pecl.php.net/vld-0.10.1 安装了一次,最后make install的时候失败了。于是换一种

#wget http://pecl.php.net/get/vld

#tar zxvf vld

#cd vld-0.11.2

#phpize

#./configure

#make install

现在去查看下/usr/lib/php5/20100525 下是否有vld.so


三:加到php里面去

#cd /etc/php5/mods-available               到php的模块目录去

#touch vld.ini                                              建个叫vld.ini 的配置文件

#echo -ne "; configuration for php VLD module \n; priority=20 \nextension=/usr/lib/php5/20100525/vld.so \n" > vld.ini       这里我比较懒。直接一句就把内容写完了,里面的vld.so是之前编译完后的vld.so 文件

#cd /etc/php5/conf.d

#ln -s  ../mods-available/vld.ini 20-vld.ini            给vld.ini 做一个软链接

#/etc/init.d/apache2 restart              重启下apache就行了





四:使用vld 

例子很简单的。新建两个php文件,输出一个用 . ,一个用 , 连起来

1.php   

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

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

在shell里面执行

 #php -dvld.active=1 1.php

#php -dvld.active=1 2.php

然后可以看到

root@debian:/home/www$ php -dvld.active=1 1.phpFinding entry pointsBranch analysis from position: 0Return foundfilename:       /home/www/1.phpfunction name:  (null)number of ops:  4compiled vars:  noneline     # *  op                           fetch          ext  return  operands---------------------------------------------------------------------------------   1     0  >   CONCAT                                           ~0      'Hello', '+'         1      CONCAT                                           ~1      ~0, 'world%21'         2      ECHO                                                     ~1   2     3    > RETURN                                                   1branch: #  0; line:     1-    2; sop:     0; eop:     3path #1: 0, 
root@debian:/home/www$ php -dvld.active=1 2.phpFinding entry pointsBranch analysis from position: 0Return foundfilename:       /home/www/2.phpfunction name:  (null)number of ops:  4compiled vars:  noneline     # *  op                           fetch          ext  return  operands---------------------------------------------------------------------------------   1     0  >   ECHO                                                     'Hello'         1      ECHO                                                     '+'         2      ECHO                                                     'world%21'   2     3    > RETURN                                                   1branch: #  0; line:     1-    2; sop:     0; eop:     3path #1: 0, Hello world!root@debian:/home/www$ 

上面就包含了PHP运行时所执行的Opcode信息,输出了执行的操作的个数,所有的变量集输出(compiled vars),还有一个包含执行操作的PHP代码行号,执行操作的次数(#)以及所执行操作的名称(op)。


我们重点关注关键项的数量,op的个数以及执行顺序。number of ops (OP数)标明了代码运行时在Opcode层级执行的操作总个数。在上面两个文件都是4次。

可以看到 1.php 执行用  "."  连接的时候,用了两个CONCAT(连接调用)和一个ECHO调用。

2.php 执行用 "," 连接的时候,没有用CONCAT操作,只有比CONCAT调用成本更低的ECHO调用。 

所以这里我们可以得出一个简单的结论,就是用 "," 连接比用  "." 连接要快。

实际在编写PHP代码的时候,我们需要考虑是empty快还是isset好,是,快还是 .好,我们可以通过VLD来看看OP数是多少,具体都执行了什么操作,这样就可以得到正确的合适的选择了。

一些有用的参数:

    -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,输出内容





原创粉丝点击