xdebug 安裝步驟
xdebug是php的一個module,需要編譯安裝,我用lnmp安裝的php,php被預設安裝到/usr/local/php,然後做一個永久連結到/usr/bin
先編譯xdebug
| 代碼如下 |
複製代碼 |
wget http://www.xdebug.org/files/xdebug-2.2.3.tgz tar xzf xdebug-2.2.3.tgz cd xdebug-2.2.3 /usr/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config
|
修改php.ini配置
把下面這些加入
| 代碼如下 |
複製代碼 |
;no-debug-non-zts-20090626 這個檔案夾名稱和php版本是一一對應的 zend_extension= "/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so" xdebug.default_enable = On xdebug.show_exception_trace = On xdebug.show_local_vars = 1 xdebug.max_nesting_level = 50 xdebug.var_display_max_depth = 6 xdebug.dump_once = On xdebug.dump_globals = On xdebug.dump_undefined = On xdebug.dump.REQUEST = * xdebug.cli_color = 2 |
利用Xdebug使調試資訊更加美觀
Xdebug擴充載入後,Xdebug會對原有的某些PHP函數進行覆寫,以便好更好地進行Debug.比如var_dump()函數,
知道通常需要在函數前後加上”<pre>…</pre>”才能夠讓輸出的變數資訊比較美觀、可讀性好.
但是載入了Xdebug後,不再需要這樣做了,Xdebug不但自動給加上了<pre>標籤,還給變數加上顏色.
例:
| 代碼如下 |
複製代碼 |
<?php $arrTest=array( "test"=>"abc", "test2"=>"abc2" ); var_dump($arrTest); ?> |
利用Xdebug測試指令碼執行時間
xdebug_time_index()來顯示時間
| 代碼如下 |
複製代碼 |
echo xdebug_time_index(); sleep(3);echo "<br>"; echo xdebug_time_index(); |
測定指令碼佔用的記憶體
想知道程式執行到某個特定階段時到底佔用了多大記憶體,為此PHP提供了函數memory_get_usage().
這個函數只有當PHP編譯時間使用了--enable-memory-limit參數時才有效.
Xdebug同樣提供了一個函數xdebug_memory_usage()來實現這樣的功能,
另外xdebug還提供了一個xdebug_peak_memory_usage()函數來查看記憶體佔用的峰值.
| 代碼如下 |
複製代碼 |
echo "<br>"; echo xdebug_memory_usage(); echo "<br>"; echo xdebug_peak_memory_usage(); |
檢測代碼中的不足
有時候代碼沒有明顯的編寫錯誤,沒有顯示任何錯誤資訊(如error、warning、notice等),但是這不表明代碼就是正確無誤的.
有時候可能某段代碼執行時間過長,佔用記憶體過多以致於影響整個系統的效率,沒有辦法直接看出來是哪部份代碼出了問題.
這時候希望把代碼的每個階段的運行情況都監控起來,寫到記錄檔中去,運行一段時間後再進行分析,找到問題所在.
之前編輯php.ini檔案
加入
| 代碼如下 |
複製代碼 |
[Xdebug] xdebug.profiler_enable=on xdebug.trace_output_dir="I:Projectsxdebug" xdebug.profiler_output_dir="I:Projectsxdebug" |
這幾行,目的就在於把執行情況的分析檔案寫入到”I:Projectsxdebug”目錄中去(可以替換成任何想設定的目錄).
如果執行某段程式後,再開啟相應的目錄,可以發現產生了一堆檔案,例如cachegrind.out.1169585776這種格式命名的檔案.
這些就是Xdebug產生的分析檔案.用編輯器開啟可以看到很多程式啟動並執行相關細節資訊,不過很顯然這樣看太累了,需要用圖形化的軟體來查看.
在Windows平台下,可以用WinCacheGrind(下載地址http://sourceforge.net/projects/wincachegrind/)這個軟體來開啟這些檔案.
可以直觀漂亮地顯示其中內容:
| 代碼如下 |
複製代碼 |
testXdebug(); function testXdebug() { requireFile(); } function requireFile() { require_once('abc.php'); } |
很直觀地看到index.php中調用了一個函數testXdebug(),testXdebug()中又調用了requireFile()函數.這樣就可以非常方便地查看整個指令碼的程式結構.
重啟php-fpm,隨便寫段錯誤的php代碼,重新整理瀏覽器,就能看到錯誤提示
在使用過程碰到一個小插曲
A:訪問超慢響應
B:訪問超快響應但是是空白頁。
問題A解決的方法很多,總歸還有解決辦法;問題B我估計是線程問題,也許可以通過調試php.ini的配置搞定,也許不是,很難講清楚,線程的問題可能要跟xdebug的版本扯上關係。
解決方式
PHP.ini 找到memory_limit參數,增大!
換一個瀏覽器!我之前一直用Google Chrome偵錯工具,之後就開始變慢下來,直到每個頁面變成6秒才載入完畢,已經忍無可忍。換成了Firefox、IE均沒有這個問題。 (這個方法很好用,還能立刻見效!)
使用 xdebug.profiler_enable_trigger配置,有選擇的運行xdebug功能探查程式。
xdebug.remote_host 的值最好跟你伺服器的IP一致,比方說你是通過localhost訪問,則這裡寫localhost,你是127.0.0.1訪問,就寫127.0.0.1
看看你的xdebug.profiler_output_dir目錄是否已經達到幾G了?(一套電商程式很可能在持續開發十幾個小時後,xdebug.profiler_output_dir目錄的xdebug檔案達到好幾G!)
平時不需要的時候,最好關閉xdebug!
| 代碼如下 |
複製代碼 |
xdebug.remote_enable = 0 xdebug.profiler_enable = 0 xdebug.remote_autostart = false |