看到了嗎? 數(shù)組元素的值自動顯示顏色。
如何利用Xdebug測試腳本執(zhí)行時(shí)間
測試某段腳本的執(zhí)行時(shí)間,通常我們都需要用到microtime()函數(shù)來確定當(dāng)前時(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ù)及絕對時(shí)間戳(例如“0.03520000 1153122275”),沒有可讀性。所以如上程序,我們需要另外寫一個(gè)函數(shù)microtime_float()
,來將兩者相加。
Xdebug
自帶了一個(gè)函數(shù)
xdebug_time_index()
來顯示時(shí)間。
如何測定腳本占用的內(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()來實(shí)現(xiàn)這樣的功能,另外xdebug還提供了一個(gè)xdebug_peak_memory_usage()函數(shù)來查看內(nèi)存占用的峰值。
如何檢測代碼中的不足?
有時(shí)候代碼沒有明顯的編寫錯誤,沒有顯示任何錯誤信息(如error、warning、notice等),但是這不表明代碼就是正確無誤的。有時(shí)候可能某段代碼執(zhí)行時(shí)間過長,占用內(nèi)存過多以致于影響整個(gè)系統(tǒng)的效率,我們沒有辦法直接看出來是哪部份代碼出了問題。這時(shí)候我們希望把代碼的每個(gè)階段的運(yùn)行情況都監(jiān)控起來,寫到日志文件中去,運(yùn)行一段時(shí)間后再進(jì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”目錄中去(你可以替換成任何你想設(shè)定的目錄)。如果你執(zhí)行某段程序后,再打開相應(yīng)的目錄,可以發(fā)現(xiàn)生成了一堆文件,例如cachegrind.out.1169585776這種格式命名的文件。這些就是Xdebug生成的分析文件。用編輯器打開你可以看到很多程序運(yùn)行的相關(guān)細(xì)節(jié)信息,不過很顯然這樣看太累了,我們需要用圖形化的軟件來查看。
哇,非常漂亮,我們很直觀地看到index.php中我們調(diào)用了一個(gè)函數(shù)testXdebug(),testXdebug()中又調(diào)用了requireFile()函數(shù)。這樣我們就可以非常方便地查看整個(gè)腳本的程序結(jié)構(gòu)。
另外,我們還可以看到每個(gè)函數(shù)被調(diào)用的次數(shù)及執(zhí)行所花費(fèi)的時(shí)間!這對于測試程序性能非常有用。
好了,這么一個(gè)簡單的程序不太能顯示出Xdebug+WinCacheGrind的強(qiáng)大,我給出一個(gè)稍大點(diǎn)的例子(一個(gè)基于Zend Framework的CMS的index.php):
從上圖可以看到:整個(gè)程序的結(jié)構(gòu),每個(gè)函數(shù)被調(diào)用的次數(shù),執(zhí)行時(shí)間都一目了然。
小結(jié):
Xdebug提供了各種自帶的函數(shù),并對已有的某些PHP函數(shù)進(jìn)行覆寫,可以方便地用于調(diào)試排錯;Xdebug還可以跟蹤程序的運(yùn)行,通過對日志文件的分析,我們可以迅速找到程序運(yùn)行的瓶頸所在,提高程序效率,從而提高整個(gè)系統(tǒng)的性能。