php調試工具Xdebug詳細使用教程

來源:互聯網
上載者:User
xdebug是一個php擴充,官方地址:https://xdebug.org/index.php,用於協助開發人員調試代碼,本文主要和大家分享php調試工具Xdebug詳細使用教程,最新的2.6版本為列來講解,希望能協助到大家。

它具備這些功能:

代替php的錯誤提示:

在提示中加入配色以強調不同資訊
大變數列印:
增強var_dump()、print_r()等列印函數的功能,在大變數列印時很有用,避免死機
最大遞迴保護:
可以設定最大遞迴次數限制,防止php卡死
函數調用追蹤:
能追蹤函數調用過程,顯示傳入和返回的值,記憶體用量等
代碼覆蓋分析:
可以找出代碼運行時哪些行被執行了
記憶體回收分析:
在php執行記憶體回收時顯示哪些變數被清理、多少記憶體被釋放等資訊
代碼效能分析:
可以看出代碼各部分的執行時間,找出代碼運行效率的瓶頸
遠端偵錯:

配合IDE工具進行遠程斷點調試,讓你一步步追蹤代碼的執行,查看或設定運行中的各變數值,避免使用var_dump()、print_r()等函數,這也是xdebug最常被使用的功能,非常強大。

安裝:
這裡以如下環境來說明,其他環境請根據提示操作:
作業系統:Windows 10
php版本:php-7.1.13-nts(32 bit)
下載:https://xdebug.org/download.php
請根據自己的環境(php版本、是否安全執行緒、位寬等)選擇適合的版本,這裡筆者依據前文環境選擇:
版本:Xdebug 2.6.0,PHP 7.1 VC14 (32 bit) 該版本在2018-01-29發布
將下載得到的檔案php_xdebug-2.6.0-7.1-vc14-nts.dll放入php的ext目錄中
修改php.ini檔案,加入如下配置:
zend_extension="php_xdebug-2.6.0-7.1-vc14-nts.dll"
執行phpinfo(),如果已經顯示了xdebug擴充則說明安裝成功,如果沒有請檢測是否選對了版本
安裝完成後要進行實際的使用還需要根據你的目的在php.ini檔案中進行特定的配置,以下根據各功能,進行常用說明

開啟Xdebug方式的錯誤提示:
只要啟用了xdebug擴充那麼該功能是預設開啟的,將以xdebug的風格進行錯誤顯示,如果想以原php的風格顯示可以在設定檔中設定:xdebug.default_enable=0,注意該設定項並不是指關閉xdebug的所有功能

配置大變數的顯示:
在有些程式中變數會很大,比如著名內容管理系統drupal8中的節點渲染數組,如果直接print_r那麼可以將記憶體8G的I5電腦卡死,所以Xdebug提供了配置大變數列印配置以避免這種情況,配置以下配置項:
xdebug.var_display_max_children
整數,預設128,顯示的數組子項目或對象屬性的最大數量,不限制則設定為-1,遠端偵錯時不受影響
xdebug.var_display_max_data
整數,預設512,顯示字串的最大長度,不限設定為-1,不影響遠端偵錯
xdebug.var_display_max_depth
整數,預設3,顯示數組或對象屬性時的最大嵌套深度,最大1023,可以用-1指代這個最大數

最大遞迴保護:
設定以下配置項:
xdebug.max_nesting_level
整數,預設為:256,不限設定為-1,無限遞迴的保護機制,當遞迴調用達到該設定時程式被中斷,注意此時不會出現任何錯誤提示,而是直接退出程式

函數調用追蹤:
包括對象方法調用,該功能預設是關閉的,開啟後將輸出調用資料到一個檔案,查看檔案即可,配置如下(這裡值設定為我們最常用的情況以便複製使用,更多見下文的配置說明):
xdebug.auto_trace=1
;開啟追蹤,預設是關閉的
xdebug.trace_output_dir="C:\root\xdebug\trace"
;調用追蹤資料輸出目錄
xdebug.trace_output_name="yunke.%s.%u"
;追蹤檔案的檔案名稱
xdebug.collect_params=4
;收集合函式參數的形式
xdebug.collect_return=1
;是否收集合函式傳回值
xdebug.show_mem_delta=1
;顯示記憶體詳情
xdebug.trace_format=0
;追蹤檔案的格式

以上設定將為所有請求產生分析檔案,調用追蹤分析還可以採用變數觸發的方式(可通過瀏覽器延伸自動完成,這也是推薦方法,見下),也就是在GET/POST 或cookie中設定變數名XDEBUG_TRACE,它的值是和以下設定項匹配的密鑰,配置如下:
xdebug.auto_trace=0
;開啟變數觸發跟蹤時自動跟蹤需要關閉
xdebug.trace_enable_trigger=1
xdebug.trace_enable_trigger_value="yunke"
;這就是上述XDEBUG_TRACE變數的值
如訪問網址:http://www.test.com/index.php?XDEBUG_TRACE=yunke,即可觸發追蹤檔案的產生
這裡"yunke"是一個密鑰值,只有和設定檔匹配才能產生分析檔案,預設為空白字元

代碼覆蓋分析:
該功能可以讓我們知道代碼執行中哪些行被執行到了,通常用於單元測試,配置如下:
xdebug.coverage_enable=1
;代碼覆蓋分析開啟

代碼覆蓋分析是通過在php代碼中調用函數來進行的,過程如下,那將得到一個數組結果:
xdebug_start_code_coverage();//開啟覆寫
…//被分析的一些代碼
var_dump(xdebug_get_code_coverage());//得到一個分析結果數組

記憶體回收分析:
該功能預設是關閉的,開啟後將輸出記憶體回收分析資料到一個檔案,查看檔案即可,配置如下(這裡值設定為我們最常用的情況以便複製使用,更多見下文的配置說明):
xdebug.gc_stats_enable=1
;開啟記憶體回收分析
xdebug.gc_stats_output_dir="C:\root\xdebug\gc"
;資料輸出目錄,預設是/tmp
xdebug.gc_stats_output_name=”gcstats.%s.%u”
;輸出檔案名,預設是: gcstats.%p

程式效能分析:
該功能預設是關閉的,開啟後將輸出效能分析資料到一個檔案,該檔案是便於機器解析的文字格式設定,需要專用軟體查看,配置如下(這裡值設定為我們最常用的情況以便複製使用,更多見下文的配置說明):
xdebug.profiler_enable=1
;開啟效能分析
xdebug.profiler_output_dir="C:\root\xdebug\profiler"
;效能分析檔案輸出目錄
xdebug.profiler_output_name="cachegrind.out.%s.%u"
;效能分析輸出檔案名

以上設定將為所有請求產生分析檔案,效能分析還可以採用變數觸發的方式(可通過瀏覽器延伸自動完成,這也是推薦方法,見下),也就是在GET/POST 或cookie中設定變數名XDEBUG_PROFILE,它的值是和以下設定項匹配的密鑰,配置如下:
xdebug.profiler_enable=0
;開啟變數觸發分析時自動分析需要關閉
xdebug.profiler_enable_trigger=1
xdebug.profiler_enable_trigger_value="yunke"
;這就是上述XDEBUG_PROFILE變數的值
即可觸發分析檔案的產生,如訪問網址:http://www.test.com/index.php?XDEBUG_PROFILE=yunke
這裡"yunke"是一個密鑰值,只有和設定檔匹配才能產生分析檔案,預設為空白字元

在官網介紹了許多種軟體來查看輸出的分析檔案,其中WinCacheGrind在小型程式分析中尚可,大型程式就力不從心了,甚至會出現錯誤,經雲客測試採用QCacheGrind 效果最好,它是KCacheGrind的Windows版本,這裡對該軟體做一個簡單介紹:
開啟後左邊有一個“Flat Profile”面板,裡面第一列“Incl.”是執行時間,包括內部調用的子程式的時間;Self列是自身消耗的時間,不包括子函數調用;Called列是該函數被調用的次數;Function是函數名;Location列是檔案位置;
時間是以微秒為單位1秒=1000000 微秒(μs),以可以採用百分比的方式

遠端偵錯:
我們先看一下遠端偵錯的整個過程,首先由瀏覽器附帶特殊參數開啟要調試的指令碼,指令碼開始運行,此時Xdebug會主動向配置好的調試用戶端發起一個串連,並採用DBGp協議和調試用戶端互動(調試用戶端往往就是我們使用的IDE,如phpstorm,它需要監聽調試網路連接埠),調試用戶端通過協議讓Xdebug一步一步的執行代碼,顯示或設定程式中的變數內容,在每一步之間Xdebug將php程式掛起暫停執行,這個“步”又叫斷點,調試用戶端可以通過設定斷點來讓程式在該處暫停,對於調試用戶端而言這又叫做斷點調試,整個過程而言是Xdebug在php引擎裡一步一步的執行代碼並操作這個過程,她接收調試用戶端的指令。
要進行遠端偵錯具體操作如下,首先需要以下配置並重啟php:
xdebug.remote_enable=1
;遠端偵錯開關
xdebug.remote_host=localhost
;遠端偵錯用戶端主機地址,也就是IDE所在主機的地址,往往就是localhost
xdebug.remote_port=9000
;遠端偵錯連接埠
配置好後,我們在瀏覽器中開啟指令碼,開啟時需要發送GET/POST變數名XDEBUG_SESSION_START或者cookie變數名XDEBUG_SESSION,其值是Xdebug和調試用戶端的通訊會話id,往往是ide指定的一個特殊字元,如phpstorm指定為“PHPSTORM”,該值可以在xdebug.idekey配置中設定,預設為空白字串;瀏覽器附加的參數可以通過瀏覽器延伸自動完成(見下);伺服器收到請求後依據xdebug.remote_mode配置項的設定開始調試過程,該配置項如果是“req”那麼指令碼剛啟動時Xdebug就向調試用戶端(IDE)發起調試串連,這也是預設值,如果是“jit”那麼僅在有錯誤出現時才發起串連,一旦和IDE的串連建立成功那麼就採用DBGp協議進行調試互動。
如果伺服器是被多個開發人員共用的,那麼調試客戶機會有多個,而xdebug.remote_host配置項只能設定一個,此時可以將xdebug.remote_connect_back設定為1,那將採用從http頭中擷取的ip來作為調試客戶機的地址。
Xdebug在發起調試串連時預設逾時時間為200毫秒,該值在xdebug.remote_timeout配置項中設定,在本機調試該值足夠了,如果是遠端網路主機那麼需要加大該值以應對網路延遲。


瀏覽器外掛程式輔助:
如前文所述,觸發方式產生分析、追蹤檔案和開啟遠端偵錯都需要在GET/POST 或cookie裡面設定特定變數和值,那麼我們能否讓瀏覽器代勞呢,這是可以的,這裡以開發人員使用最多的Firefox瀏覽器為列來說明:
先安裝輔助外掛程式,開啟地址:https://addons.mozilla.org/en-GB/firefox/addon/xdebug-helper-for-firefox/
你將看到Xdebug Helper for Firefox ,點擊Add to Firefox,按照提示操作即可
安裝完成後需要進行配置:按按鍵組合“ctrl+shift+a”開啟附加組件面板,找到Xdebug Helper,點擊選項,分別輸入IDE遠端工作階段id、分析密鑰、追蹤密鑰(對應配置中xdebug.idekey、xdebug.profiler_enable_trigger_value、xdebug.trace_enable_trigger_value),點擊儲存,此時新開網頁的瀏覽器地址欄中將出現一個爬蟲表徵圖,可以選擇四種狀態:調試、分析、追蹤、禁用,前三種種狀態下瀏覽器開啟串連時會附帶額外的cookie參數,比如我們選擇分析,那麼重新整理串連時將在cookie中添加XDEBUG_PROFILE變數,值為前文設定的密鑰值,這將讓Xdebug產生分析檔案,函數追蹤和遠端偵錯同理。

phpstorm調試:
前文說了Xdebug的遠端偵錯是她通過DBGp協議和調試用戶端互動的過程,遠端偵錯用戶端需要監聽網路連接埠以接收Xdebug發起的調試串連,這裡以PhpStorm作為遠端偵錯用戶端來講解具體操作。
PhpStorm是開發人員常用ide,這裡採用2017.2.4版本,以著名內容管理系統drupal8來說明調試過程,首先你需要安裝配置好Xdebug,主機選擇:localhost,連接埠選擇預設的9000,Firefox瀏覽器安裝了前一節提到的Xdebug Helper for Firefox擴充,然後開啟PhpStorm建立的drupal項目(還不知道如何建立項目?請百度或drupal官網),開啟:file > Default Settings > Languages &Frameworks > PHP > Debug > Xdebug
連接埠設定為9000,其他配置項視你情況選擇,點擊Apply和OK
開啟調試配置面板(Run > Edit Configurations),點擊左上方加號選擇PHP Web Application,輸入調試名稱(隨意),這裡輸入drupal,點擊Server一行的三個點號,開啟伺服器配置面板,輸入伺服器名稱,url地址和連接埠,調試器選擇Xdebug,路徑映射不用勾選,點擊應用ok,回到前一個面板,Start URL 輸入“/”,瀏覽器選擇安裝了Xdebug Helper for Firefox擴充的Firefox,應用OK,
此時phpstorm介面右上方調試按鈕一行的下拉式功能表自動選擇了剛剛建立的調試“drupal”,點擊電話表徵圖(表徵圖耳機變為在聽狀態)或者點擊菜單Run | Start listen for PHP Debug Connections開始監聽9000連接埠,在index檔案中設定一個斷點(點擊程式碼號左側的空白,出現紅色圓點),好了一切準備就緒,下面開啟Firefox瀏覽器,將地址欄爬蟲表徵圖選擇為“debug”,開啟一個drupal頁面,此時phpstrom將開啟左下角的調試面板,該面板提供了許多按鈕以供你作業碼執行:變數子面板列出了當前範圍所有的變數,在這裡你可以查看所有的變數內容;Watches面板可以跟蹤變數或運算式的內容;Frames面板列出當前行所在的呼叫堆疊幀。
如何使用phpstorm進行調試請查看官方文檔,不再細述,這裡提供一些phpstorm官網提供的調協助文檔頁:
安裝配置:
https://confluence.jetbrains.com/display/PhpStorm/Zero-configuration+Web+Application+Debugging+with+Xdebug+and+PhpStorm
調試操作:
https://confluence.jetbrains.com/display/PhpStorm/Using+the+PhpStorm+Debugger

注意調試開始後將停留在第一個斷點所在位置,如果你一個斷點也沒有設定,那麼偵錯工作階段將立即結束,你也可以設定調試停留在第一行代碼上(選擇Run > Break at first line in PHP scripts)。
如果調試過程中瀏覽器出現500錯誤,且調試串連斷開,很可能是伺服器將php程式終止了,如果你是FastCGI 方式啟動並執行Apache,錯誤記錄檔類似為“End of script output before headers”,請設定伺服器設定檔httpd.conf中的FcgidIOTimeout、IPCCommTimeout 參數為你希望的等待時間,單位為秒,其他環境請自行檢查逾時配置。


常用配置:
全部設定及詳細見:https://xdebug.org/docs/all_settings,本文只進行大概介紹
xdebug.trace_output_dir
函數調用跟蹤資料檔案的寫入目錄,預設為 /tmp,確保可寫
xdebug.trace_output_name
追蹤檔案的檔案名稱指引,預設為:trace.%c 比如:yunke.%s.%u 將輸出帶路徑的腳步名及帶微妙的時間,如下:yunke.C__root_test_index_php.1520473784_260486.xt
xdebug.auto_trace
開啟函數調用追蹤,布爾值,預設為0
xdebug.collect_assignments
布爾值,預設為0,是否在函數追蹤中添加變數賦值
xdebug.collect_includes
布爾值,預設為1,是否將include(), include_once(), require() or require_once() 的檔案寫入追蹤檔案
xdebug.collect_params
整數,預設0,決定函數追蹤的參數收集,0為不收集,1參數的類型和數量,2在1基礎上加工具提示資訊,3全變數內容(受到變數輸出設定的影響),4全變數內容和變數名,5php序列化內容沒有變數名
xdebug.collect_return
布爾值,預設0,是否寫入函數調用的傳回值到追蹤檔案
xdebug.show_mem_delta
整數,預設為0,非0值將顯示函數調用的記憶體用量資訊
xdebug.trace_format
整型,預設0,追蹤檔案的格式,0為人類可讀格式(時間索引,記憶體用量等等)1機器易讀格式2人類可讀格式以網頁展現
xdebug.trace_options
整數,預設為0,如果設定為1,那麼追蹤檔案採用追加方式,而不是覆蓋
xdebug.var_display_max_children
整數,預設128,顯示的數組子項目或對象屬性的最大數量,不限制設定為-1,遠端偵錯時不受影響
xdebug.var_display_max_data
整數,預設512,顯示字串的最大長度,不限設定為-1,不影響遠端偵錯
xdebug.var_display_max_depth
整數,預設3,顯示數組或對象屬性時的最大嵌套深度,最大1023,可以用-1指代這個最大數
xdebug.coverage_enable
布爾,預設為1,是否開啟代碼覆蓋分析,雲客實測該設定項無效,開啟和得到分析結果需用函數
xdebug.gc_stats_enable
布爾值,預設為0,是否開啟記憶體回收統計分析
xdebug.gc_stats_output_dir
垃圾統計分析的寫入目錄,注意許可權
xdebug.gc_stats_output_name
垃圾分析檔案的檔案名稱,和追蹤分析的檔案名稱規則一樣
xdebug.profiler_enable
整數,預設為0,為1時將開啟效能分析功能
xdebug.profiler_aggregate
整數,預設0,非0時將多個請求的分析資料寫入一個檔案中以進行跨請求分析
xdebug.profiler_append
整數,預設0,分析檔案是否採用追加模式,檔案名稱的設定對該項有影響
xdebug.profiler_enable_trigger
整數,預設為0,採用觸發模式開啟分析功能,開啟它時需要關閉xdebug.profiler_enable
xdebug.profiler_enable_trigger_value
字串。預設為“”,觸發分析的密鑰,配合xdebug.profiler_enable_trigger使用
xdebug.profiler_output_dir
字串,預設為/tmp,分析檔案輸出目錄
xdebug.profiler_output_name
分析檔案名稱,預設為cachegrind.out.%p,見xdebug.trace_output_name
xdebug.extended_info
整型,預設為1,是否強制php解析器執行extended_info模式
xdebug.idekey
字串,預設: *complex*,偵錯工作階段id,經雲客測試瀏覽器發送任意值均可開始調試,所以她並非密鑰值,但有些調試用戶端可以通過它來判斷是否接受調試串連,所以最好統一
xdebug.remote_addr_header
預設為空白字串“”,用以指定哪個http頭代表調試用戶端地址,和xdebug.remote_connect_back 組合使用
xdebug.remote_autostart
布爾值,預設0,通常使用特定變數開始遠端偵錯,如果該項被設定為1,那麼總是開啟
xdebug.remote_connect_back
布爾值,預設0,解決多人調試問題,忽略設定的固定ip,指示伺服器依據請求地址連結
xdebug.remote_cookie_expire_time
整數。預設3600,遠端偵錯cookie超期時間
xdebug.remote_enable
布爾值,預設0,是否啟用遠端偵錯
xdebug.remote_host
字串,預設:localhost,遠端偵錯用戶端的地址
xdebug.remote_log
字串,預設空,遠端偵錯記錄檔名
xdebug.remote_mode
字串,遠端偵錯預設,req指令碼一啟動就連結,jit當錯誤發生時連結
xdebug.remote_port
遠端偵錯端主機連接埠,預設9000
xdebug.remote_timeout
整數,預設200,單位毫秒,等待調試連結的時間
xdebug.default_enable
布爾值,1或0,開啟以xdebug的方式進行錯誤提示,預設開啟
xdebug.max_nesting_level
整數,預設為:256,無限遞迴的保護機制,當遞迴調用達到該設定時程式被中斷
xdebug.max_stack_frames
整數,預設值-1,設定錯誤提示時堆棧中有多少個幀被顯示
xdebug.scream
布爾值,預設為0,是否禁用“@”,以便錯誤被強制顯示


xdebug擴充開啟後具備的函數:
當擴充被載入後,php指令碼中可以使用以下函數:
(這裡只列出部分,全部請見https://xdebug.org/docs/all_functions)
string xdebug_call_class( [int $depth = 1] )
顯示調用類
string xdebug_call_file( [int $depth = 1] )
顯示調用檔案
string xdebug_call_function( [int $depth = 1] )
返回調用函數
int xdebug_call_line( [int $depth = 1] )
返回調用行
void xdebug_disable()
禁用堆疊追蹤
void xdebug_enable()
開啟堆疊追蹤
bool xdebug_is_enabled()
檢查堆疊追蹤是否被開啟
string xdebug_get_collected_errors( [int clean] )
從錯誤集緩衝中返回所有錯誤資訊
array xdebug_get_headers()
返回header() 函數設定的所有頭資訊
nt xdebug_memory_usage()
返回記憶體使用量量
nt xdebug_peak_memory_usage()
返回到目前為止指令碼使用過的最大記憶體用量
void xdebug_start_error_collection()
收集錯誤並禁止顯示
void xdebug_stop_error_collection()
停止錯誤記錄,並從緩衝中收集
float xdebug_time_index()
返回當前點的執行時間,單位秒
相關推薦:

淺述PHP7的安裝調試工具Xdebug擴充的方法

關於PHP7如何安裝調試工具Xdebug擴充的方法教程(圖)

Xdebug配置不成功

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.