為什麼需要Debugger?
PHP程式員調試使用echo、print_r()、var_dump()、printf()等,其實對 於有較豐富開發經驗的程式員來說這些也已經足夠了,他們往往可以在程式執行的過程中,通過輸出特定變數的值可以判斷程式執行是否正確,甚至效率高低也可以 看出來(當然可能還需要使用一些時間函數)。那麼我們為什麼還需要一個專門的偵錯工具來監控我們的程式運行呢。
什麼是Xdebug?
Xdebug是一個開放原始碼的PHP程式調試器(即一個Debug工具),可以用來跟蹤,調試和分析PHP程式的健全狀態。
如何安裝Xdebug。:
1. 開啟http://www.xdebug.org/download.php下載相應的版本
Win: Windows binaries版本
Linux: source
得到一個dll檔案(win)或運行安裝檔案(linux)
2. 安裝
Win:將下載的dll檔案放到相應的目錄中。比如我的就放D:\xampp\php\ext下面;
Linux:執行安裝檔案
tar -xvzf xdebug-2.1.2.tgz
cd xdebug-2.1.2
phpize (如果phpize沒有這個command,需要安裝一次phpize。phpize可以讓php支援擴充模組)安裝phpize:sudo apt-get install php5-dev
如果安裝了繼續進行下面命令
./configure
make
make install
會有這個介面
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輸出的資料檔案的目錄,可自由設定。
4. 重啟Apache;
5. 寫一個test.php,內容為<?php phpinfo(); ?>,如果輸出的內容中有看到xdebug,說明安裝配置成功。如下圖:
現在我們來從最簡單的程式調試開始一步步介紹Xdebug。
調試:
我們先寫一個可以導致執行出錯的程式,例如嘗試包含一個不存在的檔案。
testXdebug.php <?php
require_once(‘abc.php’);
?>
然後通過瀏覽器訪問,我們驚奇地發現,出錯資訊變成了彩色的了:
不過除了樣式改變,和我們平時列印的出錯資訊內容沒什麼不同,意義不大。好,我們繼續改寫程式:
testXdebug2.php <?php
testXdebug();
function testXdebug() {
require_once('abc.php');
}
?>
輸出資訊:
發現了什麼。 Xdebug跟蹤代碼的執行,找到了出錯的函數testXdebug()。
我們把代碼再寫得複雜一些:
testXdebug3.php <?php
testXdebug();
function testXdebug() {
requireFile();
}
function requireFile() {
require_once('abc.php');
}
?>
輸出資訊:
也就是說Xdebug具有類似於Java的Exception的“跟蹤回溯”的功能,可以根據程式的執行一步步跟蹤到出錯的具體位置,哪怕程式中的調用很複雜,我們也可以通過這個功能來理清代碼關係,迅速定位,快速排錯。
其實PHP函數debug_backtrace()也有類似的功能,但是要注意debug_backtrace()函數只在PHP4.3.0之後版本及PHP5中才生效。這個函數是PHPTeam Dev在PHP5中新增的函數,然後又反向移植到PHP4.3中。
如何利用Xdebug測試指令碼執行時間
測試某段指令碼的執行時間,通常我們都需要用到microtime()函數來確定目前時間。例如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()返回的值是微秒數及絕對時間戳記(例如“0.03520000 1153122275”),沒有可讀性。所以如上程式,我們需要另外寫一個函數microtime_float(),來將兩者相加。
Xdebug內建了一個函數xdebug_time_index()來顯示時間。
如何測定指令碼佔用的記憶體。
有時候我們想知道程式執行到某個特定階段時到底佔用了多大記憶體,為此PHP提供了函數memory_get_usage()。這個函數只有當PHP編譯時間使用了-enable-memory-limit參數時才有效。
Xdebug同樣提供了一個函數xdebug_memory_usage()來實現這樣的功能,另外xdebug還提供了一個xdebug_peak_memory_usage()函數來查看記憶體佔用的峰值。
如何檢測代碼中的不足。