1. 程式人生 > >PHP除錯工具的使用XDEBUG

PHP除錯工具的使用XDEBUG

為什麼需要 Debugger?
很 多PHP程式 員除錯使用echo、print_r()、var_dump()、printf()等,其實對於有較豐富開發 經驗的程式設計師 來說這些也已經足夠 了,他們往往可以在程式執行的過程中,通過輸出特定變數的值可以判斷程式執行是否正確,甚至效率高低也可以看出來(當然可能還需要使用一些時間函式 )。那 麼我們為什麼還需要一個專門的除錯程式來監控我們的程式執行 呢? 這個問題的答案不妨留到後面來揭曉。

什麼是 Xdebug?
Xdebug是一個開放原始碼 的PHP程式偵錯程式(即一個Debug工具),可以用來跟蹤,除錯和分析PHP程式的執行狀況。Xdebug現在的最新版本是

xdebug 2.0.0beta6 ,支援PHP4/PHP5。

官方站點:www.Xdebug.org

如何安裝 Xdebug
以PHP5.1.4,Windows平臺為例(其它PHP版本,其它平臺請參看官網文件):
1. 登入www.xdebug.org ,在首頁右側有一個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輸出的資料
檔案的目錄,可自由設定。
4. 重啟Apache;
5. 寫一個test.php,內容為<?php phpinfo(); ?> ,如果輸出的內容中有看到xdebug,說明安裝配置成功。





現在我們就可以開始使用 Xdebug 強大的功能了!

Go on..現在我們來從最簡單的程式除錯開始一步步介紹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中才生效。這個函式是PHP開發團隊在PHP5中新增的函式,然後又反向移植到PHP4.3中。

如何利用 Xdebug 使除錯資訊更加美觀?

Xdebug 擴充套件載入後,Xdebug會對原有的某些PHP函式進行覆寫,以便好更好地進行Debug。比如var_dump()函式,我們知道通常我們需要在函式前 後加上”<pre>…</pre>”才能夠讓輸出的變數資訊比較美觀、可讀性好。但是載入了Xdebug後,我們不再需要這樣做 了,Xdebug不但自動給我們加上了<pre>標籤,還給變數加上顏色。

例:
<?php
$arrTest=array(
       "test"=>"abc",
       "test2"=>"abc2"
);

var_dump($arrTest);
?>

輸出:



看到了嗎? 陣列 元素的值自動顯示顏色。

如何利用 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() 函式來檢視記憶體佔用的峰值。

如何檢測程式碼中的不足?

有時候程式碼沒有明顯的編寫錯誤,沒有顯示任何錯誤資訊(如 error warning notice 等), 但是這不表明程式碼就是正確無誤的。有時候可能某段程式碼執行時間過長,佔用記憶體過多以致於影響整個系統的效率,我們沒有辦法直接看出來是哪部份程式碼出了問 題。這時候我們希望把程式碼的每個階段的執行情況都監控起來,寫到日誌檔案中去,執行一段時間後再進行分析,找到問題所在。

回憶一下,之前我們編輯 php.ini 檔案
加入
[Xdebug]
xdebug.profiler_enable=on
xdebug.trace_output_dir="I:\Projects\xdebug"
xdebug.profiler_output_dir="I:\Projects\xdebug"

這幾行,目的就在於把執行情況的分析檔案寫入到 I:\Projects\xdebug” 目錄中去(你可以替換成任何你想設定的目錄)。如果你執行某段程式後,再開啟相應的目錄,可以發現生成了一堆檔案,例如 cachegrind.out.1169585776 這種格式命名的檔案。這些就是 Xdebug 生成的分析檔案。用編輯器開啟你可以看到很多程式執行的相關細節資訊,不過很顯然這樣看太累了,我們需要用圖形化的軟體 來檢視。


Windows 平臺下,可以用 WinCacheGrind(wincachegrind.souceforge.net) 這個軟體來開啟這些檔案。 可以直觀漂亮地顯示其中內容:



哇,非常漂亮,我們很直觀地看到 index.php 中我們呼叫了一個函式 testXdebug() testXdebug() 中又呼叫了 requireFile() 函式。這樣我們就可以非常方便地檢視整個指令碼的程式結構。

另外,我們還可以看到每個函式被呼叫的次數及執行所花費的時間!這對於測試程式效能非常有用。





好了,這麼一個簡單的程式不太能顯示出 Xdebug+WinCacheGrind 的強大,我給出一個稍大點的例子(一個基於 Zend Framework CMS index.php ):







從上圖可以看到:整個程式的結構,每個函式被呼叫的次數,執行時間都一目瞭然。

小結:
Xdebug 提供了各種自帶的函式,並對已有的某些 PHP 函式進行覆寫,可以方便地用於除錯排錯; Xdebug 還可以跟蹤程式的執行,通過對日誌檔案的分析,我們可以迅速找到程式執行的瓶頸所在,提高程式效率,從而提高整個系統的效能。