今天我就就自己對XDebug使用的一些體驗做一小段分享。XDebug也是因為需要是用來生成覆蓋率分析文件才安裝的,剛接觸不久,平時用的也不是很頻繁,但是這個的確是一個好工具,如果想要依賴它來分析程序的性能還是需要自己親手去試試。具體它有多好,請聽我一一道來。
<!--[if !supportLists]-->一、<!--[endif]-->安裝篇(XDebug 和PHPUnit)
A:安裝XDebug:
Xdebug網下載xdebug dll文件,存放到php加載的ext目錄下(可以選擇重命名,比如php_xdebug.dll,然後打開php.ini文件,添加配置
[xdebug]
zend_extension_ts = php_xdebug.dll
xdebug.profiler_enable = on
xdebug.trace_output_dir = D:\PHPAPP\XDebug
xdebug.profiler_output_dir=D:\PHPAPP\XDebug
xdebug需要采用zend引擎加載的方式加載,所以用zend_extension_ts或是zend_extension, ts是thread_safety, 目前5.3以上才支持zend_extension加載,<5.3的用zend_extension_ts加載(或者你可以查看phpinfo是否啟用了zts),然後重啟apache,查看phpinfo,就發現XDebug選項了。
可以看到xdebug.profiler_enable,xdebug.profiler_output_dir,xdebug.trace_output_dir這三個是我們剛剛配置的項,可以安裝自己的需要配置剩余項,xdebug.profiler_enable:開啟性能分析,
開啟這個之後會在xdebug.profiler_output_dir這個目錄下生成cachegrind.out.XXX的分析文件,如果指定了xdebug.profiler_output_name這個,則輸出來的文件就會是指定的名字.xxx的格式(此方法不適合分析,原因稍後說明),
xdebug.trace_options:這個是開啟跟蹤項,
開啟該項之後,會在xdebug.trace_output_dir下生產跟蹤文件,注意該項會影響運行速度,因為他需要記錄跟蹤過程中的一系列事件。
關於XDebug還有一點需要注意的:XDebug是調試的,也就是說配置了XDebug那程序運行的就是一個Debug狀態,所以這時候zend_optimizer就不能用了,總不能讓程序即調試狀態又處於優化狀態哈。
更多關於XDebug的,大家去網上發掘吧~~然後一起探討哈
友情提醒:對於使用集成環境的同學,比如Wamp,它擁有兩個PHP.ini配置文件,一個在Apache下,一個在PHP下,Apache下是影響web的,而PHP下是影響命令行的,所以····(感謝俊哥的提醒)
B:安裝PHPUnit:
關於PHPUnit的安裝過程,網上也已經很多了,之前自己為了終於安裝成功之後也小寫了篇安裝篇(http://user.qzone.qq.com/414073277/blog/1292122868),所以這裡就不再贅述了,網上的一些安裝教程大都能完成安裝。就簡單說下過程:
PHPUnit安裝用的是pear的安裝方式,所以如果機子沒有安裝過pear包需要先安裝下,一般在php安裝的時候在其安裝目錄下都有一個go-pear.bat文件,直接執行即可完成安裝,【這裡安裝需要注意擴展exif,這個擴展會用到mbstring擴展中的方法,所以mbstring的加載順序需要再exif之上。】完成pear的安裝之後就可以執行pear,查看pear的命令參數,
然後依次執行:
pear channel-discover pear.phpunit.de
pear install –alldeps phpunit/PHPUnit
需要注意的是現在最新版的phpunit是3.5的··但是這個只有pear的版本是1.6以上及PHP5.2.X才會安裝得到最新版·否則是安裝的是第一次的版本(不過不影響使用)。
安裝好後就可以執行phpunit查看相關信息:
可以看到有—coverage-html –coverage-clover –coverage-source這三個選項·就是因為在XDebug安裝成功之後才能用,這三個對於導出覆蓋率文件可是很重要的選項。
<!--[if !supportLists]-->二、<!--[endif]-->PHPUnit 單元測試覆蓋率分析
單元測試,最重要的指標之一就是覆蓋率。這點雖然Zend Studio上可以很清晰的看出來,可是要導出成一分文檔就不太好使了,所以這時候XDebug就又可以幫上忙了,使用的時候也挺簡單,調用命令即可:
phpunit –coverage-html D:\PHPAPP\XDebug\ YouTest
這樣就會將生成的覆蓋文件(html格式的)放在D:\PHPAPP\XDebug\目錄下了,
然後就可以在放置的目錄下找到一堆的html文件,運行下index.html
就可以看到這樣的圖了,英文字母很簡單··意思也明了就不解釋了,說明一點:
測試結果說明:一共有5種,上圖的例子出現了兩種。
. :代表正確
F :代表斷言錯誤
E :代表PHP程序錯誤或是異常
I : 代表沒有實現的方法
S : 代表是跳過的方法
生產的覆蓋文件說明:
Classes: 只有一個類中的所有方法都被覆蓋的時候,這個類才算是被測試完的
Functions/Methods :只有一個方法或是函數的所有有效的語句代碼都被執行到了才算這個方法或是函數是被測試完的
Lines: 總行數將會不飽行注釋,空行,<?php ?> 標簽, 及類及方法的聲明。
使用phpunit –coverage-clover D:\PHPAPP\XDebug\first.xml YouTest
生產的將會是一個xml格式的文件,這個格式的文件效果不明顯,沒有html格式的好,這邊的效果被我刪掉了所以麼有效果圖可看,第三個覆蓋文件的參數我沒測試過,大家有興趣可以試試。
<!--[if !supportLists]-->三、<!--[endif]-->程序執行性能分析
XDebug除了有效的幫助分析單元測試覆蓋率之外,還可以幫組分析程序執行的瓶頸所在,開啟分析的功能:
xdebug.profiler_enable = on
xdebug.profiler_output_dir=D:\PHPAPP\XDebug
設置上面兩項,然後執行你要分析的程序,就會在上面的目錄下看到cachegrind.out.XXX的文件,這個文件直接打開就是一些記錄,需要借助第三方的cachegrind查看工具才行,一個好用的工具是winCacheGrind,查看起來很方便。
可以看到執行的總時間,及每個函數執行的時間。
因為這個工具在打開文件的時候,只能打開cachegrind.out.*的文件,所以待分析的文件必須是這個名字的,所以為了省去重命名,這也就是為啥我說不建議修改xdebug.profiler_output_name這個選項的原因。
XDebug除了上述方式外,還有自己的一些函數庫提供,可以在你程序的代碼段任何地方執行,具體的請看http://xdebug.org/docs/all_functions