Xdebug是一個(gè)開(kāi)放源代碼的PHP程序調(diào)試器(即一個(gè)Debug工具),以php模塊的形式加載并被使用?梢杂脕(lái)跟蹤,調(diào)試和分析PHP程序的運(yùn)行狀況。Xdebug提供了各種自帶的函數(shù),并對(duì)已有的某些PHP函數(shù)進(jìn)行覆寫(xiě),可以方便地用于調(diào)試排錯(cuò);Xdebug還可以跟蹤程序的運(yùn)行,通過(guò)對(duì)日志文件的分析,我們可以迅速找到程序運(yùn)行的瓶頸所在,提高程序效率,從而提高整個(gè)系統(tǒng)的性能。
為什么需要Debugger?
很多PHP程序員調(diào)試使用echo、print_r()、var_dump()、printf()等,其實(shí)對(duì) 于有較豐富開(kāi)發(fā)經(jīng)驗(yàn)的程序員來(lái)說(shuō)這些也已經(jīng)足夠了,他們往往可以在程序執(zhí)行的過(guò)程中,通過(guò)輸出特定變量的值可以判斷程序執(zhí)行是否正確,甚至效率高低也可以 看出來(lái)(當(dāng)然可能還需要使用一些時(shí)間函數(shù))。那么我們?yōu)槭裁催需要一個(gè)專門(mén)的調(diào)試程序來(lái)監(jiān)控我們的程序運(yùn)行呢? 這個(gè)問(wèn)題的答案不妨留到后面來(lái)揭曉。
如何安裝Xdebug?:
1. 打開(kāi)http://www.xdebug.org/download.php下載相應(yīng)的版本
Win: Windows binaries版本
Linux: source
得到一個(gè)dll文件(win)或運(yùn)行安裝文件(linux)
2. 安裝
Win:將下載的dll文件放到相應(yīng)的目錄中。比如我的就放D:\xampp\php\ext下面;
Linux:執(zhí)行安裝文件
tar -xvzf xdebug-2.1.2.tgz
cd xdebug-2.1.2
phpize (如果phpize沒(méi)有這個(gè)command,需要安裝一次phpize。phpize可以讓php支持?jǐn)U展模塊)安裝phpize:sudo apt-get install php5-dev
如果安裝了繼續(xù)進(jìn)行下面命令
./configure
make
make install
會(huì)有這個(gè)界面
cp modules/xdebug.so /usr/lib/php5/20090626+lfs 將xdebug.so文件移到php5下面
3. 編輯php.ini,加入下面幾行:
[Xdebug]
zend_extension=D:\xampp\php\ext\php_xdebug.dll (Win)
zend_extension= /usr/lib/php5/20090626+lfs/xdebug.so (Linux)
xdebug.profiler_enable=on
xdebug.trace_output_dir="../Projects/xdebug"
xdebug.profiler_output_dir="../Projects/xdebug"
后面的目錄“../Projects/xdebug”為你想要放置Xdebug輸出的數(shù)據(jù)文件的目錄,可自由設(shè)置。
4. 重啟Apache;
5. 寫(xiě)一個(gè)test.php,內(nèi)容為<?php phpinfo(); ?>,如果輸出的內(nèi)容中有看到xdebug,說(shuō)明安裝配置成功。如下圖:
現(xiàn)在我們來(lái)從最簡(jiǎn)單的程序調(diào)試開(kāi)始一步步介紹Xdebug。
調(diào)試:
我們先寫(xiě)一個(gè)可以導(dǎo)致執(zhí)行出錯(cuò)的程序,例如嘗試包含一個(gè)不存在的文件。
testXdebug.php
<?php
require_once(‘a(chǎn)bc.php’);
?>
然后通過(guò)瀏覽器訪問(wèn),我們驚奇地發(fā)現(xiàn),出錯(cuò)信息變成了彩色的了:
不過(guò)除了樣式改變,和我們平時(shí)打印的出錯(cuò)信息內(nèi)容沒(méi)什么不同,意義不大。好,我們繼續(xù)改寫(xiě)程序:
testXdebug2.php
<?php
testXdebug();
function testXdebug() {
require_once('abc.php');
}
?>
輸出信息:
發(fā)現(xiàn)了什么? Xdebug跟蹤代碼的執(zhí)行,找到了出錯(cuò)的函數(shù)testXdebug()。
我們把代碼再寫(xiě)得復(fù)雜一些:
testXdebug3.php
<?php
testXdebug();
function testXdebug() {
requireFile();
}
function requireFile() {
require_once('abc.php');
}
?>
輸出信息:
也就是說(shuō)Xdebug具有類似于Java的Exception的“跟蹤回溯”的功能,可以根據(jù)程序的執(zhí)行一步步跟蹤到出錯(cuò)的具體位置,哪怕程序中的調(diào)用很復(fù)雜,我們也可以通過(guò)這個(gè)功能來(lái)理清代碼關(guān)系,迅速定位,快速排錯(cuò)。
其實(shí)PHP函數(shù)debug_backtrace()也有類似的功能,但是要注意debug_backtrace()函數(shù)只在PHP4.3.0之后版本及PHP5中才生效。這個(gè)函數(shù)是PHP開(kāi)發(fā)團(tuán)隊(duì)在PHP5中新增的函數(shù),然后又反向移植到PHP4.3中。
如何利用Xdebug測(cè)試腳本執(zhí)行時(shí)間
測(cè)試某段腳本的執(zhí)行時(shí)間,通常我們都需要用到microtime()函數(shù)來(lái)確定當(dāng)前時(shí)間。例如PHP手冊(cè)上的例子:
<?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ù)及絕對(duì)時(shí)間戳(例如“0.03520000 1153122275”),沒(méi)有可讀性。所以如上程序,我們需要另外寫(xiě)一個(gè)函數(shù)microtime_float(),來(lái)將兩者相加。
Xdebug自帶了一個(gè)函數(shù)xdebug_time_index()來(lái)顯示時(shí)間。
如何測(cè)定腳本占用的內(nèi)存?
有時(shí)候我們想知道程序執(zhí)行到某個(gè)特定階段時(shí)到底占用了多大內(nèi)存,為此PHP提供了函數(shù)memory_get_usage()。這個(gè)函數(shù)只有當(dāng)PHP編譯時(shí)使用了-enable-memory-limit參數(shù)時(shí)才有效!
Xdebug同樣提供了一個(gè)函數(shù)xdebug_memory_usage()來(lái)實(shí)現(xiàn)這樣的功能,另外xdebug還提供了一個(gè)xdebug_peak_memory_usage()函數(shù)來(lái)查看內(nèi)存占用的峰值。
如何檢測(cè)代碼中的不足?
有時(shí)候代碼沒(méi)有明顯的編寫(xiě)錯(cuò)誤,沒(méi)有顯示任何錯(cuò)誤信息(如error、warning、notice等),但是這不表明代碼就是正確無(wú)誤的。有時(shí)候可能某段代碼執(zhí)行時(shí)間過(guò)長(zhǎng),占用內(nèi)存過(guò)多以致于影響整個(gè)系統(tǒng)的效率,我們沒(méi)有辦法直接看出來(lái)是哪部份代碼出了問(wèn)題。這時(shí)候我們希望把代碼的每個(gè)階段的運(yùn)行情況都監(jiān)控起來(lái),寫(xiě)到日志文件中去,運(yùn)行一段時(shí)間后再進(jìn)行分析,找到問(wèn)題所在。
回憶一下,之前我們編輯php.ini文件
加入
[Xdebug]
xdebug.profiler_enable=on
xdebug.trace_output_dir="I:\Projects\xdebug"
xdebug.profiler_output_dir="I:\Projects\xdebug"
這幾行,目的就在于把執(zhí)行情況的分析文件寫(xiě)入到”../Projects/xdebug”目錄中去(你可以替換成任何你想設(shè)定的目錄)。如果你執(zhí)行某段程序后,再打開(kāi)相應(yīng)的目錄,可以發(fā)現(xiàn)生成了一堆文件,例如cachegrind.out.1169585776這種格式命名的文件。這些就是Xdebug生成的分析文件。用編輯器打開(kāi)你可以看到很多程序運(yùn)行的相關(guān)細(xì)節(jié)信息。