程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> php Xdebug的安裝與使用詳解

php Xdebug的安裝與使用詳解

編輯:PHP綜合
為什麼需要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中才生效。這個函數是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還可以跟蹤程序的運行,通過對日志文件的分析,我們可以迅速找到程序運行的瓶頸所在,提高程序效率,從而提高整個系統的性能。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved