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

一: 我的环境: 

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.php
Finding entry points
Branch analysis from position: 0
Return found
filename:       /home/www/1.php
function name:  (null)
number of ops:  4
compiled vars:  none
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   1     0  >   CONCAT                                           ~0      'Hello', '+'
         1      CONCAT                                           ~1      ~0, 'world%21'
         2      ECHO                                                     ~1
   2     3    > RETURN                                                   1

branch: #  0; line:     1-    2; sop:     0; eop:     3
path #1: 0, 
root@debian:/home/www$ php -dvld.active=1 2.php
Finding entry points
Branch analysis from position: 0
Return found
filename:       /home/www/2.php
function name:  (null)
number of ops:  4
compiled vars:  none
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   1     0  >   ECHO                                                     'Hello'
         1      ECHO                                                     '+'
         2      ECHO                                                     'world%21'
   2     3    > RETURN                                                   1

branch: #  0; line:     1-    2; sop:     0; eop:     3
path #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数是多少,具体都执行了什么操作,这样就可以得到正确的合适的选择了。





 

posted @ 2013-07-22 18:47  javawebsoa  Views(316)  Comments(0Edit  收藏  举报