Xdebug 的安裝與使用

爲何須要Debugger?php

不少PHP程序員調試使用echo、print_r()、var_dump()、printf()等,其實對 於有較豐富開發經驗的程序員來講這些也已經足夠了,他們每每能夠在程序執行的過程當中,經過輸出特定變量的值能夠判斷程序執行是否正確,甚至效率高低也能夠 看出來(固然可能還須要使用一些時間函數)。那麼咱們爲何還須要一個專門的調試程序來監控咱們的程序運行呢? 這個問題的答案不妨留到後面來揭曉。linux

什麼是Xdebug?程序員

Xdebug是一個開放源代碼的PHP程序調試器(即一個Debug工具),能夠用來跟蹤,調試和分析PHP程序的運行情況。瀏覽器

如何安裝Xdebug?編輯器

1. 打開http://www.xdebug.org/download.php下載相應的版本函數

Win: Windows binaries版本工具

  Linux: source性能

獲得一個dll文件(win)或運行安裝文件(linux)測試

2. 安裝 ui

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中才生效。這個函數是PHP開發團隊在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()函數來查看內存佔用的峯值。

如何檢測代碼中的不足?

有時候代碼沒有明顯的編寫錯誤,沒有顯示任何錯誤信息(如error、warning、notice等),可是這不代表代碼就是正確無誤的。有時候可能某段代碼執行時間過長,佔用內存過多以至於影響整個系統的效率,咱們沒有辦法直接看出來是哪部份代碼出了問題。這時候咱們但願把代碼的每一個階段的運行狀況都監控起來,寫到日誌文件中去,運行一段時間後再進行分析,找到問題所在。

回憶一下,以前咱們編輯php.ini文件

加入

[Xdebug]

xdebug.profiler_enable=on

xdebug.trace_output_dir="I:\Projects\xdebug"

xdebug.profiler_output_dir="I:\Projects\xdebug"

這幾行,目的就在於把執行狀況的分析文件寫入到」../Projects/xdebug」目錄中去(你能夠替換成任何你想設定的目錄)。若是你執行某段程序後,再打開相應的目錄,能夠發現生成了一堆文件,例如cachegrind.out.1169585776這種格式命名的文件。這些就是Xdebug生成的分析文件。用編輯器打開你能夠看到不少程序運行的相關細節信息,

最後:

Xdebug提供了各類自帶的函數,並對已有的某些PHP函數進行覆寫,能夠方便地用於調試排錯;Xdebug還能夠跟蹤程序的運行,經過對日誌文件的分析,咱們能夠迅速找到程序運行的瓶頸所在,提升程序效率,從而提升整個系統的性能。

相關文章
相關標籤/搜索