wget http://pecl.php.net/get/vld-0.11.2.tgz
tar zxf vld-0.11.2.tgz
cd vld-0.11.2
which phpize
/usr/bin/phpize
find / -name 'php-config'
/usr/bin/php-config
./configure --with-php-config=/usr/bin/php-config --enable-vld
echo $?
make && make install
ll /usr/lib64/php/modules/
vi php.ini
extension=vld.so
/etc/init.d/php-fpm restart
查看phpinfo()
====================案例:
vi demo.php
$a = ‘hello world’;
echo $a;
=====================源碼分析:
[root@node2 yeqing]# php -dvld.active=1 ./demo.php
Finding entry points
Branch analysis from position: 0
Return found
filename: /home/yeqing/demo.php
function name: (null)
number of ops: 3
compiled vars: !0 = $a
line # * op fetch ext return operands
---------------------------------------------------------------------------------
2 0 > ASSIGN !0, 'hello+world%21%21'
3 1 ECHO !0
6 2 > RETURN 1
branch: # 0; line: 2- 6; sop: 0; eop: 2
path #1: 0,
hello world!!
================
行號、opcodes指令編號、腳本開始標記、結束標記、ZEND VM指令、返回值、ZEND VM指令對應的參數
opcodes手冊:
http://php.net/manual/en/internals2.opcodes.list.php
================如上爲VLD輸出的PHP代碼生成的中間代碼的信息,說明以下
Branch analysis from position 這條信息多在分析數組時使用。
Return found 是否返回,這個基本上有都有。
filename 分析的文件名
function name 函數名,針對每一個函數VLD都會生成一段如上的獨立的信息,這裏顯示當前函數的名稱
number of ops 生成的操做數
compiled vars 編譯期間的變量,這些變量是在PHP5後添加的,它是一個緩存優化。這樣的變量在PHP源碼中以IS_CV標記。
op list 生成的中間代碼的變量列表
使用-dvld.active參數輸出的是VLD默認設置,若是想看更加詳細的內容。可使用-dvld.verbosity參數。
php -dvld.active=1 -dvld.verbosity=3 demo.php
其中:
-dvld.verbosity=3是VLD在當前版本能夠顯示的最詳細的信息
若是咱們只是想要看輸出的中間代碼,並不想執行這段PHP代碼,可使用-dvld.execute=0來禁用代碼的執行
php -dvld.active=1 -dvld.execute=0 demo.php
讀源碼要學會一種精神: 順藤摸瓜
參考文檔:
http://www.php-internals.com/book/?p=C-php-vld
http://www.php-internals.com/book/?p=chapt02/02-03-02-opcode
http://php.net/manual/zh/internals2.ze1.zendapi.php
http://www.laruence.com/2011/03/04/1894.html
http://blog.pureisle.net/archives/2294.html
http://www.imsiren.com/archives/704
http://blog.csdn.net/siren0203/article/details/8085813
http://www.cnblogs.com/miao-zp/p/6374311.html
php