xdebug是一款常用來調試php程序的一個性能的工具,下面本文章介紹在lnmp系統安裝配置xdebug與最后簡單調試方法,還有在調試過程碰到一些問題解決辦法.
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實例代碼如下:
- <?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
新聞熱點
疑難解答