爲何須要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
而後經過瀏覽器訪問,咱們驚奇地發現,出錯信息變成了彩色的了:
不過除了樣式改變,和咱們平時打印的出錯信息內容沒什麼不一樣,意義不大。好,咱們繼續改寫程序:
testXdebug2.php
輸出信息:
發現了什麼? Xdebug跟蹤代碼的執行,找到了出錯的函數testXdebug()。
咱們把代碼再寫得複雜一些:
testXdebug3.php
輸出信息:
也就是說Xdebug具備相似於Java的Exception的「跟蹤回溯」的功能,能夠根據程序的執行一步步跟蹤到出錯的具體位置,哪怕程序中的調用很複雜,咱們也能夠經過這個功能來理清代碼關係,迅速定位,快速排錯。
其實PHP函數debug_backtrace()也有相似的功能,可是要注意debug_backtrace()函數只在PHP4.3.0以後版本及PHP5中才生效。這個函數是PHP開發團隊在PHP5中新增的函數,而後又反向移植到PHP4.3中。
如何利用Xdebug測試腳本執行時間
測試某段腳本的執行時間,一般咱們都須要用到microtime()函數來肯定當前時間。例如PHP手冊上的例子:
可是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還能夠跟蹤程序的運行,經過對日誌文件的分析,咱們能夠迅速找到程序運行的瓶頸所在,提升程序效率,從而提升整個系統的性能。