為什么需要Debugger?
很多PHP程序員調試使用echo、print_r()、var_dump()、printf()等,其實對 於有較豐富開發經驗的程序員來說這些也已經足夠了,他們往往可以在程序執行的過程中,通過輸出特定變量的值可以判斷程序執行是否正確,甚至效率高低也可以 看出來(當然可能還需要使用一些時間函數)。那么我們為什么還需要一個專門的調試程序來監控我們的程序運行呢? 這個問題的答案不妨留到后面來揭曉。
什么是Xdebug?
Xdebug是一個開放源代碼的PHP程序調試器(即一個Debug工具),可以用來跟蹤,調試和分析PHP程序的運行狀況。
如何安裝Xdebug?:
1. 打開http://www.xdebug.org/download.php下載相應的版本 依據自己服務器使用的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
require_once(‘abc.php’);
?>
然后通過瀏覽器訪問,我們驚奇地發現,出錯信息變成了彩色的了:
不過除了樣式改變,和我們平時打印的出錯信息內容沒什么不同,意義不大。好,我們繼續改寫程序:
testXdebug2.php
testXdebug();
function testXdebug() {
require_once('abc.php');
}
?>
輸出信息:
發現了什么? Xdebug跟蹤代碼的執行,找到了出錯的函數testXdebug()。
我們把代碼再寫得復雜一些:
testXdebug3.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手冊上的例子:
/* *
* 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還可以跟蹤程序的運行,通過對日志文件的分析,我們可以迅速找到程序運行的瓶頸所在,提高程序效率,從而提高整個系統的性能
【在windows里的安裝】
1. 下載XDebug二進制文件: http://www.xdebug.org/download.php
5.2 http://www.xdebug.org/files/php_xdebug-2.1.0-5.2-vc6.dll
5.3 http://www.xdebug.org/files/php_xdebug-2.1.0-5.3-vc6.dll
2. 找到php.ini
3. 如果配置過 ZendOptimizer, 需要先屏蔽 ZendOptimizer 有關的配置, 通常如下:
[Zend]
zend_extension_manager.optimizer_ts="path\ZendOptimizer-3.3.0\lib\Optimizer-3.3.0"
zend_extension_ts="path\ZendOptimizer-3.3.0\lib\ZendExtensionManager.dll"
4. 加入 XDebug 配置:
zend_extension_ts="path/xdebug/php_xdebug-2.1.0-5.2-vc6.dll"
[Xdebug]
xdebug.profiler_enable=on
xdebug.trace_output_dir="path\xdebug"
xdebug.profiler_output_dir="path\xdebug"
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000
說明: 上面 "path" 的地方需要修改為你自己的本地路徑.
5. 重啟 Apache 或者 IIS.
6. 查看 phpinfo 的輸出, 如果看到 XDebug 的選項, 就說明配置成功了.
以下是其他網友的文章
一、安裝xdebug模塊
1、去www.xdebug.org下載相應版本php的模塊文件,保存下載后的文件到php的ext目錄,可以自己修改文件的名稱,如保存成:php_xdebug.dll
2、修改php.ini,增加如下信息
復制代碼 代碼如下:
[Xdebug]
zend_extension_ts="c:/webserver/php5/ext/php_xdebug.dll"
xdebug.auto_trace=on
xdebug.collect_params=on
xdebug.collect_return=on
xdebug.trace_output_dir="c:/webserver/php5/debuginfo"
xdebug.profiler_enable=on
xdebug.profiler_output_dir="c:/webserver/php5/debuginfo"
參數解釋:
zend_extension_ts="c:/webserver/php5/ext/php_xdebug.dll"
;加載xdebug模塊。這里不能用extension=php_xdebug.dll的方式加載,必須要以zend的方式加載,否則安裝上后,phpinfo是顯示不出xdebug這個項的。
xdebug.auto_trace=on;
;自動打開“監測函數調用過程”的功模。該功能可以在你指定的目錄中將函數調用的監測信息以文件的形式輸出。此配置項的默認值為off。
xdebug.collect_params=on;
;打開收集“函數參數”的功能。將函數調用的參數值列入函數過程調用的監測信息中。此配置項的默認值為off。
xdebug.collect_return=on
;打開收集“函數返回值”的功能。將函數的返回值列入函數過程調用的監測信息中。此配置項的默認值為off。
xdebug.trace_output_dir=”c:\Temp\xdebug”
;設定函數調用監測信息的輸出文件的路徑。
xdebug.profiler_enable=on
;打開效能監測器。
xdebug.profiler_output_dir=”c:\Temp\xdebug”;
;設定效能監測信息輸出文件的路徑。
還有一些更為具體的參數設定,詳見:http://www.xdebug.org/docs-settings.php
3、重啟apache
這樣,在本地運行php的時候,會在所設定的目錄里產生一些調試信息的文件:
函數調用過程監測信息文件的文件名格式:trace.××××××.xt。這個文件可以直接查看,里面包含了函數運行的時間,函數調用的參數值,返回值,所在的文件和位置等信息。內容格式還是相對直觀的。
效能監測文件的文件名格式:cachegrind.out.××××××××。
這個文件也可以直接查看,不過信息格式不易被人類所理解,
所以我們需要接下來的一個軟件。
二、安裝wincachegrind
由於效能監測文件:cachegrind.out.××××××××文件的內容不易被人類所理解,所以我們需要一個工具來讀取它。windows下就有一款這樣的軟件:wincachegrind。
1、到http://sourceforge.net/projects/wincachegrind/下載安裝wincachegrind
2、安裝運行后,點擊Tools->options,設定你的working folder(php.ini里xdebug.profiler_output_dir的值)
這樣就可以比較直觀的查看效能監測文件的信息了。
詳細出處參考:http://www.jb51.net/article/24199.htm
說道PHP代碼調試,對於有經驗的PHPer,通過echo、print_r、var_dump函數,或PHP開發工具zend studio、editplus可解決大部分問題,但是對於PHP入門學習的童鞋來說有一定的難度,而且僅僅通過上述這些PHP調試手段,也很難准確發現PHP性能方面的問題,Xdebug是一個非常有用的PHP調試工具。
Xdebug作為PHP調試工具,提供了豐富的調試函數,也可將Xdebug安裝配置為zend studio、editplus調試PHP的第三方插件,通過開啟自動跟蹤(auto_trace)和分析器功能,可以直觀的看到PHP源代碼的性能數據,以便優化PHP代碼。今天和大家分享PHP調試工具Xdebug安裝以及配置方面的基礎知識。
Xdebug在PHP中的安裝配置涉及php.ini配置文件的修改。
Xdebug安裝教程
下載Xdebug
首先我們需要下載Xdebug,務必根據安裝的PHP版本,選擇合適的Xdebug版本,由於我是在Windows環境下安裝PHP的(請參考Windows 7下安裝配置PHP+Apache+Mysql環境教程),所以選擇下載Windows版本的Xdebug2.1.0(5.3 VC6 (32 bit)),下載下來的Xdebug文件為php_xdebug-2.1.0-5.3-vc6.dll,這是由於Xdebug是作為PHP模塊的形式被安裝配置與使用的。
Xdebug安裝提示:如果你不清楚安裝的PHP版本,你可以通過phpinfo()函數參看,同時Xdebug也提供了phpinfo輸出信息分析工具來幫助你分析如何安裝Xdebug,只要將phpinfo輸出信息復制提交即可,地址:Xdebug phpinfo信息分析地址
安裝Xdebug
將下載的php_xdebug-2.1.0-5.3-vc6.dll復制到PHP安裝目錄下的ext目錄,此處為C:\php\ext,ext目錄專門用來存放PHP擴展庫DLL文件。
配置php.ini
安裝Xdebug的最后一步就是配置php.ini文件,打開C:\php目錄下的php.ini配置文件,在末尾添加
1
2 |
[Xdebug]
zend_extension="c:/php/ext/php_xdebug-2.1.0-5.3-vc6.dll" |
最后重啟Apache服務器,通過phpinfo()函數,可以看到
Xdebug配置提示:PHP5.3之前版本配置Xdebug時使用zend_extension_ts,對於PHP5.3以上版本,使用zend_extension。
XDEBUG NOT LOADED AS ZEND EXTENSION信息出現的原因
出現XDEBUG NOT LOADED AS ZEND EXTENSION的原因是在安裝Xdebug時由於我們將Xdebug的DLL文件復制到了php\ext目錄下,容易以PHP擴展庫的形式加載Xdebug,在php.ini文件中添加了
1
|
extension=php_xdebug-2.1.0-5.3-vc6.dll
|
這是錯誤的Xdebug安裝方式,必須以zend方式加載。
至此PHP Xdebug的基礎安裝教程就結束了,下面我們需要對Xdebug作一些基礎配置。
Xdebug配置教程
在安裝完Xdebug后,我們還需要對Xdebug做基礎配置,默認Xdebug的PHP函數自動跟蹤(auto_trace)功能、分析器功能並沒有開啟,作為調試PHP代碼的需要,有些Xdebug配置選項最好開啟。
在此之前我們需要創建Xdebug自動跟蹤以及分析器輸出文件的存放目錄,務必確保目錄是可讀寫的,此處我在D:\PHPWeb\下創建了xdebug\trace以及xdebug\profiler目錄。
最后在php.ini配置文件中完成Xdebug的配置工作,找到
1
2 |
[Xdebug]
zend_extension="c:/php/ext/php_xdebug-2.1.0-5.3-vc6.dll" |
在此之后添加Xdebug配置信息
1
2 3 4 5 6 |
xdebug.auto_trace=1
xdebug.collect_params=1 xdebug.collect_return=1 xdebug.trace_output_dir="D:/PHPWeb/xdebug/trace" xdebug.profiler_enable=1 xdebug.profiler_output_dir="D:/PHPWeb/xdebug/profiler" |
最后保存php.ini,並重啟Aapche服務器即可。
Xdebug部分配置選項說明
xdebug.auto_trace = 1
是否允許Xdebug跟蹤函數調用,跟蹤信息以文件形式存儲,默認值為0
collect_params = 1
是否允許Xdebug跟蹤函數參數,默認值為0
xdebug.collect_return = 1
是否允許Xdebug跟蹤函數返回值,默認值為0
xdebug.profiler_enable = 1
打開xdebug的性能分析器,以文件形式存儲,這項配置是不能以ini_set()函數配置的,默認值為0
xdebug.profiler_output_dir
性能分析文件的存放位置,默認值為/tmp
xdebug.profiler_output_name
性能分析文件的命名規則,默認值為cachegrind.out.%p
xdebug.trace_output_dir
函數調用跟蹤信息輸出文件目錄,默認值為/tmp
xdebug.trace_output_name
函數調用跟蹤信息輸出文件命名規則,默認為trace.%c
特別說明:Xdebug的trace和profiler的輸出文件名規則是可以更改的,比如將文件名命名為具體跟蹤的PHP執行文件名、進程ID、隨機數等,非常方便,更多的Xdebug配置選項說明,請參考官網的Xdebug配置選項說明。
至此PHP調試工具Xdebug教程之Xdebug的安裝和配置就介紹完了,今后還將陸續介紹Xdebug如何在zend studio以及editplus中配置使用。