xdebug調試PHP程式的學習筆記

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.