轉(zhuǎn)載自:http://blog.csdn.net/guoguo1980/article/details/1041725
為什么需要Debugger?
很多PHP程序員調(diào)試使用echo、print_r()、var_dump()、printf()等,其實對于有較豐富開發(fā)經(jīng)驗的程序員來說這些也已經(jīng)足夠了,他們往往可以在程序執(zhí)行的過程中,通過輸出特定變量的值可以判斷程序執(zhí)行是否正確,甚至效率高低也可以看出來(當然可能還需要使用一些時間函數(shù))。那么我們?yōu)槭裁催€需要一個專門的調(diào)試程序來監(jiān)控我們的程序運行呢? 這個問題的答案不妨留到后面來揭曉。
什么是Xdebug?
Xdebug是一個開放源代碼的PHP程序調(diào)試器(即一個Debug工具),可以用來跟蹤,調(diào)試和分析PHP程序的運行狀況。Xdebug現(xiàn)在的最新版本是
xdebug 2.0.0beta6,支持PHP4/PHP5。
官方站點:www.Xdebug.org
如何安裝Xdebug?
以PHP5.1.4,Windows平臺為例(其它PHP版本,其它平臺請參看官網(wǎng)文檔):
1. 登錄
www.xdebug.org,在首頁右側(cè)有一個
Windows modules,選擇其中的PHP5.1.2+,下載php_xdebug-5.1.2-2.0.0beta6.dll文件;
2. 將下載的php_xdebug-5.1.2-2.0.0beta6.dll放到C:/php5/ext目錄,重命名為php_xdebug.dll;
3. 編輯php.ini,加入下面幾行:
extension=php_xdebug.dll
[Xdebug]
xdebug.profiler_enable=on
xdebug.trace_output_dir="I:/Projects/xdebug"
xdebug.profiler_output_dir="I:/Projects/xdebug"
后面的目錄“I:/Projects/xdebug”為你想要放置Xdebug輸出的數(shù)據(jù)文件的目錄,可自由設置。
4. 重啟Apache;
5. 寫一個test.php,內(nèi)容為<?php phpinfo(); ?>,如果輸出的內(nèi)容中有看到xdebug,說明安裝配置成功。
現(xiàn)在我們就可以開始使用Xdebug強大的功能了!
作者:Haohappy
MSN: haohappy at msn.com
Blog: http://blog.csdn.net/haohappy2004
2006-07-04
Go on..現(xiàn)在我們來從最簡單的程序調(diào)試開始一步步介紹Xdebug。
調(diào)試:
我們先寫一個可以導致執(zhí)行出錯的程序,例如嘗試包含一個不存在的文件。
testXdebug.php
<?php
require_once(‘abc.php’);
?>
然后通過瀏覽器訪問,我們驚奇地發(fā)現(xiàn),出錯信息變成了彩色的了:

不過除了樣式改變,和我們平時打印的出錯信息內(nèi)容沒什么不同,意義不大。好,我們繼續(xù)改寫程序:
testXdebug2.php
<?php
testXdebug();
function testXdebug() {
require_once('abc.php');
}
?>
輸出信息:

發(fā)現(xiàn)了什么? Xdebug跟蹤代碼的執(zhí)行,找到了出錯的函數(shù)testXdebug()。
我們把代碼再寫得復雜一些:
testXdebug3.php
<?php
testXdebug();
function testXdebug() {
requireFile();
}
function requireFile() {
require_once('abc.php');
}
?>
輸出信息:

呵呵,也就是說Xdebug具有類似于Java的Exception的“跟蹤回溯”的功能,可以根據(jù)程序的執(zhí)行一步步跟蹤到出錯的具體位置,哪怕程序中的調(diào)用很復雜,我們也可以通過這個功能來理清代碼關系,迅速定位,快速排錯。
其實PHP函數(shù)debug_backtrace()也有類似的功能,但是要注意debug_backtrace()函數(shù)只在PHP4.3.0之后版本及
PHP5中才生效。這個函數(shù)是PHP開發(fā)團隊在PHP5中新增的函數(shù),然后又反向移植到PHP4.3中。
如何利用Xdebug使調(diào)試信息更加美觀?
Xdebug擴展加載后,Xdebug會對原有的某些PHP函數(shù)進行覆寫,以便好更好地進行Debug。比如var_dump()函數(shù),我們知道通常我們需要在函數(shù)前后加上”<pre>…</pre>”才能夠讓輸出的變量信息比較美觀、可讀性好。但是加載了Xdebug后,我們不再需要這樣做了,Xdebug不但自動給我們加上了<pre>標簽,還給變量加上顏色。
例:
<?php
$arrTest=array(
"test"=>"abc",
"test2"=>"abc2"
);
var_dump($arrTest);
?>
輸出:

看到了嗎? 數(shù)組元素的值自動顯示顏色。
如何利用Xdebug測試腳本執(zhí)行時間
測試某段腳本的執(zhí)行時間,通常我們都需要用到microtime()函數(shù)來確定當前時間。例如PHP手冊上的例子:
<?php
/**
* Simple function to replicate PHP 5 behaviour
*/
function
microtime
_float
()
{
list(
$usec
,
$sec
) =
explode
(
" "
,
microtime
());
return ((float)
$usec
+ (float)
$sec
);
}
$time_start
=
microtime
_float
();
// Sleep for a while
usleep
(
100
);
$time_end
=
microtime
_float
();
$time
=
$time_end
-
$time_start
;
echo
"Did nothing in $time seconds
/n
"
;
?>
但是
microtime()
返回的值是微秒數(shù)及絕對時間戳(例如“0.03520000 1153122275”),沒有可讀性。所以如上程序,我們需要另外寫一個函數(shù)microtime_float()
,來將兩者相加。
Xdebug
自帶了一個函數(shù)
xdebug_time_index()
來顯示時間。
如何測定腳本占用的內(nèi)存?
有時候我們想知道程序執(zhí)行到某個特定階段時到底占用了多大內(nèi)存,為此PHP提供了函數(shù)memory_get_usage()。這個函數(shù)只有當PHP編譯時使用了--enable-memory-limit參數(shù)時才有效。
Xdebug同樣提供了一個函數(shù)xdebug_memory_usage()來實現(xiàn)這樣的功能,另外xdebug還提供了一個xdebug_peak_memory_usage()函數(shù)來查看內(nèi)存占用的峰值。
如何檢測代碼中的不足?
有時候代碼沒有明顯的編寫錯誤,沒有顯示任何錯誤信息(如error、warning、notice等),但是這不表明代碼就是正確無誤的。有時候可能某段代碼執(zhí)行時間過長,占用內(nèi)存過多以致于影響整個系統(tǒng)的效率,我們沒有辦法直接看出來是哪部份代碼出了問題。這時候我們希望把代碼的每個階段的運行情況都監(jiān)控起來,寫到日志文件中去,運行一段時間后再進行分析,找到問題所在。
回憶一下,之前我們編輯php.ini文件
加入
[Xdebug]
xdebug.profiler_enable=on
xdebug.trace_output_dir="I:/Projects/xdebug"
xdebug.profiler_output_dir="I:/Projects/xdebug"
這幾行,目的就在于把執(zhí)行情況的分析文件寫入到”I:/Projects/xdebug”目錄中去(你可以替換成任何你想設定的目錄)。如果你執(zhí)行某段程序后,再打開相應的目錄,可以發(fā)現(xiàn)生成了一堆文件,例如cachegrind.out.1169585776這種格式命名的文件。這些就是Xdebug生成的分析文件。用編輯器打開你可以看到很多程序運行的相關細節(jié)信息,不過很顯然這樣看太累了,我們需要用圖形化的軟件來查看。
哇,非常漂亮,我們很直觀地看到index.php中我們調(diào)用了一個函數(shù)testXdebug(),testXdebug()中又調(diào)用了requireFile()函數(shù)。這樣我們就可以非常方便地查看整個腳本的程序結構。
另外,我們還可以看到每個函數(shù)被調(diào)用的次數(shù)及執(zhí)行所花費的時間!這對于測試程序性能非常有用。
好了,這么一個簡單的程序不太能顯示出Xdebug+WinCacheGrind的強大,我給出一個稍大點的例子(一個基于Zend Framework的CMS的index.php):
從上圖可以看到:整個程序的結構,每個函數(shù)被調(diào)用的次數(shù),執(zhí)行時間都一目了然。
小結:
Xdebug提供了各種自帶的函數(shù),并對已有的某些PHP函數(shù)進行覆寫,可以方便地用于調(diào)試排錯;Xdebug還可以跟蹤程序的運行,通過對日志文件的分析,我們可以迅速找到程序運行的瓶頸所在,提高程序效率,從而提高整個系統(tǒng)的性能。