在建立PHP開發調試環境時,經常會遇到xdebug無法成功安裝的問題,其實主要原因有兩點:
1. xdebug版本和php版本不匹配
2.xdebug和 zend不能同時運行,需要在php.ini中禁掉zend配置
針對第一個問題的解決方案,可是使用xdebug官方提供的URL來自動檢查與您server php環境相匹配的xdebug版本。
-
首先確保web server可以正常運行
-
在Browser中查看phpinfo,URL:http://127.0.0.1/phpinfo
-
在Browser中右鍵,查看源代碼,拷貝phpinfo的源代碼
-
將phpinfo源代碼全部copy到上面的頁面里的輸入框中
-
最后點擊頁面最下方的"Analyse my phpinfo() output" 按鈕
-
最后將會看到我們的系統環境中需要安裝哪個版本的php xdebug dll的版本
php.ini文件中關於xdebug的配置如下:
- [Xdebug]
- zend_extension="xbug dll路徑"
- xdebug.auto_trace = On
- xdebug.show_exception_trace = On
- xdebug.remote_autostart = On
- xdebug.remote_enable = On
- xdebug.remote_host = 127.0.0.1
- xdebug.remote_port = 9000
- xdebug.remote_handler = dbgp
- xdebug.profiler_enable = on
- xdebug.profiler_output_dir="日志路徑"
完整配置及解析:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
xdebug.auto_trace=1
xdebug.default_enable = 1
;最大遞歸數
xdebug.max_nesting_level=100
;重寫var_dump()
xdebug.overload_var_dump = On
;當這個參數被設置為1時,即使捕捉到異常,xdebug仍將強制執行異常跟蹤當一個異常出現時
xdebug.show_exception_trace=1
xdebug.show_local_vars = 1
xdebug.collect_params=On
xdebug.collect_return=On
xdebug.collect_vars=On
xdebug.profiler_enable_trigger=On
xdebug.profiler_append = 0
xdebug.profiler_enable = 1
xdebug.dump_once = On
xdebug.dump_globals = On
xdebug.dump_undefined = On
xdebug.dump.REQUEST = *
;xdebug.dump.SERVER = *
xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT
|
所有配置文件
xdebug.auto_trace
類型: boolean(布爾型), 默認值: 0
當開啟這項配置時,在腳本運行之前,對函數調用的追蹤就會啟用.這使得開發者可以在auto_prepend_file文件中追蹤腳本.
xdebug.cli_color
類型: integer(整型), 默認值: 0, 在Xdebug 2.2
如果這項被設置為1, 當使用CLI模式並且輸出端是打字機時,Xdebug將會為變量信息和堆棧軌跡輸出添加顏色. 在Windows系統下, ANSICON工具需要被安裝.
如果這項被設置為2, Xdebug將始終為變量信息和堆棧軌跡輸出添加顏色, 不管它是否連接到一台打字機也不管ANSICON是否被安裝. 在這種情況下, 你可能會停止轉義代碼.
查看這篇文章以獲取更多細節.
xdebug.collect_assignments
類型: boolean(布爾型), 默認值: 0, 在Xdebug 2.1
此項,默認為0, 控制Xdebug是否應該對函數軌跡添加變量分配追蹤.
xdebug.collect_includes
類型: boolean(布爾型), 默認值: 1
此項,默認為1, 控制Xdebug是否應該將在include(), include_once(), require()或require_once()函數中使用的文件名寫入追蹤文件。
xdebug.collect_params
類型: integer(整型), 默認值: 0
此參數,默認為0,當在函數軌跡或堆棧軌跡中記錄一個函數調用時,控制Xdebug是否應該搜集傳遞給函數的參數
默認值為0,因為對於大腳本來說,它可能消耗大量的內存而使腳本無法運行。啟用該選項是安全的,但是如果腳本中含有大量函數調用或者有大數據結構作 為參數的話,可能會遇到一些問題。 Xdebug 2改進了內存使用,此問題不再存在,因為它不再將這些信息存儲在內存中。相反,Xdebug會將這些信息寫入硬盤,這意味着你得留意硬盤使用量。
此參數用4個不同的可選值,每個不同的值都會對應顯示不同的信息。以下你將看到每個參數值所提供顯示的信息,查看章節堆棧軌跡以獲取詳細介紹。.
值 | 顯示的信息 |
---|---|
0 | 無 |
1 | 變(常)量類型和長度(大小)(如string(6), array(8))。 |
2 | 變(常)量類型和長度(大小), 含有用以顯示完整信息的幫助工具1。 |
3 | 完整變量內容(包括通過xdebug.var_display_max_children, xdebug.var_display_max_data和xdebug.var_display_max_depth參數設置的限制信息。 |
4 | 完整變量內容和名稱。 |
1 在帶有CLI的PHP版本中,將不會擁有幫助工具,在輸出文件中同樣也沒有。
xdebug.collect_return
類型:boolean(布爾型), 默認值:0
此設置,默認值為0,控制Xdebug是否應該將函數調用的返回值寫入軌跡文件。
xdebug.collect_vars
類型: boolean(布爾型), 默認值: 0
這個設置告訴Xdebug來搜集在一定范圍內使用的變量的信息。這一過程很慢,因為Xdebug必須對PHP的opcode數組進行反向工程。這個設置不會記錄不同變量的變量值,如果需要記錄變量值,可以使用xdebug.collect_params。只有當你希望使用xdebug_get_declared_vars()參數時,xdebug.collect_params才需要被啟用。
xdebug.coverage_enable
類型:boolean(布爾型), 默認值: 1, 在Xdebug 2.2 版中引進
如果此項設置為0,Xdebug將不會建立內部結構來支持代碼作用域。這將使Xdebug的運行速度稍微加快,當然 代碼作用域分析也將不起作用。
xdebug.default_enable
類型: boolean(布爾型), 默認值: 1
如果這項被設置為1, 在發生錯誤事件時,將默認顯示堆棧軌跡. 你可以通過在代碼中使用xdebug_disable()來禁用顯示堆棧軌跡. 由於這是Xdebug的基本函數之一,所以最好使用其默認值。
xdebug.dump.*
類型: string(字符串), 默認值: Empty
* = COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION。這7個參數控制當錯誤情況發生時,顯示哪些超全局變量。在php.ini設置中,要顯示的超全局變量之間用逗號隔開,但是要確保沒有添加 空格。如果要在錯誤發生時顯示REMOTE_ADDR和REQUEST_METHOD,添加如下設置:
xdebug.dump.SERVER = REMOTE_ADDR,REQUEST_METHOD
xdebug.dump_globals
類型: boolean(布爾型), 默認值: 1
控制是否顯示由xdebug.dump.* 參數指定的超全局變量的值。
xdebug.dump_once
類型: boolean(布爾型), 默認值: 1
控制是對所有的錯誤情況(設置為0)都顯示超全局變量的值還是只對第一個發生的錯誤情況(設置為1)顯示超全局變量的值。
xdebug.dump_undefined
類型: boolean(布爾型), 默認值: 0
如果你想顯示超全局變量中未定義的值,你應該將此項設置為1,否則使用默認值。
xdebug.extended_info
類型:integer(整型), 默認值: 1
控制Xdebug是否應該為PHP語法解析強制使用’extended_info’模式; 這將允許Xdebug使用遠程調試器設置文件/行斷點.當對腳本進行追蹤或者效能分析時,你通常會想要關閉該選項,因為PHP生成的op數組將 不斷增大,而它作為你腳本的第三方將降低腳本的執行效率。此設置項不能通過ini_set()函數進行設置, 而只能通過php.ini.
xdebug.file_link_format
類型: string(字符串), 默認值: , 在Xdebug 2.1 版中引進
此設置控制在堆棧軌跡顯示中的超鏈接格式,堆棧軌跡中使用了文件名稱。它將允許IDE來建立一個鏈接協議,通過點擊Xdebug顯示在堆棧軌跡中的文件名能夠直接跳轉到指定的行和文件。 鏈接格式可能是這種形式:
myide://%f@%l
可用的格式操作符有:
操作符 | 意義 |
---|---|
%f | 文件名 |
%l | 行號 |
如果要在linux下使用火狐瀏覽器,請遵循以下步驟:
- 打開about:config
- 添加一個boolean(布爾型)設置”network.protocol-handler.expose.xdebug”
- 將下面的代碼寫入一個shell腳本”~/bin/ff-xdebug.sh”:
#! /bin/sh f=`echo $1 | cut -d @ -f 1 | sed 's/xdebug:\/\///'` l=`echo $1 | cut -d @ -f 2`
再添加以下的其中一行(取決與你用komodo還是gvim):
-
komodo $f -l $l
gvim --remote-tab +$l $f
- 使用
chmod +x ~/bin/ff-xdebug.sh
命令讓腳本可執行 - 將xdebug.file_link_format設置為
xdebug://%f@%l
Windows and netbeans
- 創建一個名為
netbeans.bat
的文件並且將其保存到你的路徑中(如:C:\Windows
):@echo off setlocal enableextensions enabledelayedexpansion set NETBEANS=%1 set FILE=%~2 %NETBEANS% --nosplash --console suppress --open "%FILE:~19%" nircmd win activate process netbeans.exe
注意: 如果你沒有
nircmd
,移除最后一行. - 將一下的代碼保存為
netbeans_protocol.reg
文件:Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\netbeans] "URL Protocol"="" @="URL:Netbeans Protocol" [HKEY_CLASSES_ROOT\netbeans\DefaultIcon] @="\"C:\\Program Files\\NetBeans 7.1.1\\bin\\netbeans.exe,1\"" [HKEY_CLASSES_ROOT\netbeans\shell] [HKEY_CLASSES_ROOT\netbeans\shell\open] [HKEY_CLASSES_ROOT\netbeans\shell\open\command] @="\"C:\\Windows\\netbeans.bat\" \"C:\\Program Files\\NetBeans 7.1.1\\bin\\netbeans.exe\" \"%1\""
注意: 確保你將路徑修改到Netbeans的安裝目錄 (兩次),同時也要 修改
netbeans.bat
補丁文件的路徑,如果你將其保存在C:\Windows\
之外的目錄. - 雙擊
netbeans_protocol.reg
文件來將其導入注冊表. - 將xdebug.file_link_format的值設置為
xdebug.file_link_format = "netbeans://open/?f=%f:%l"
xdebug.idekey
類型:string(字符串), 默認值: *complex*
控制Xdebug應該將哪個IDE鍵傳遞給DBGp調試器助手. 默認值是基於環境變量的. 首先會查詢環境變量的DBGP_IDEKEY設置, 然后是USER,最后是USERNAME.默認被設置為第一個被找到的 環境變量的值. 如果沒有查詢到任何值,默認值為”.如果此項被設置,它通常會覆蓋環境變量的值.
xdebug.manual_url
類型: string(字符串), 默認值: http://www.php.net
xdebug信息中有關函數和錯誤信息的超鏈接將直接鏈接到PHP幫助手冊中的函數頁面。最好將此項設置為最近的鏡像。
xdebug.max_nesting_level
類型: integer(整型), 默認值: 100
用來控制對無限遞歸的保護機制。 此項的值限制了在腳本中斷之前,運行嵌套執行的函數的最大數目(即最大遞歸次數,超過這個數,php腳本將中斷執行)。
xdebug.overload_var_dump
類型: boolean(布爾型), 默認值: 1, 在Xdebug 2.1 版中引進
默認情況下,當php.ini的html_errors設置為1時,Xdebug將使用重載的var_dump()函數來顯示變量信息。如果你不想這樣,那么你可以把此項設置為0,但是在此之前你有必要先檢查,確保沒有關閉html_errors。
xdebug.profiler_append
類型:integer(整型), 默認值: 0
當此選項設置為1, 在一個新的請求被映射到相同的文件(依賴於xdebug.profiler_output_name的設置)時,效能分析文件的內容不會被覆蓋。新的內容將會被追加到原文件的最后。
xdebug.profiler_enable
類型:integer(整型), 默認值: 0
啟用Xdebug的效能分析器,效能文件被創建在 profile output directory目錄. 這些文件可以被 KCacheGrind讀取以呈現在你面前。此指令不能在腳本中通過ini_set()來設置,如果你想有選擇的啟用效能分析, 請設置xdebug.profiler_enable_trigger為1,不要使用此指令。
xdebug.profiler_enable_trigger
類型:integer(整型), 默認值: 0
當此選項設置為1,通過使用XDEBUG_PROFILE作為GET/POST參數,或者以XDEBUG_PROFILE作為名稱來設置一個cookie,你可以觸發生成效能分析文件。 這樣,效能數據將會被寫入defined directory目錄. 如果不想為每一個請求都生成效能分析文件,你需要將 xdebug.profiler_enable設置為0.
xdebug.profiler_output_dir
類型:string(字符串), 默認值: /tmp
效能分析器的輸出信息將被寫入的目錄,確保執行PHP腳本的用戶擁有對目錄的寫權限。這條指令不能通過 ini_set()函數設置。
xdebug.profiler_output_name
類型:string(字符串), 默認值: cachegrind.out.%p
這項設置決定被用來轉存效能信息文件的名稱。它通過格式操作符來鑒別名稱格式,跟 sprintf()和strftime()函數類似。有若干格式操作符可以被用來格式化文件名稱。
查看xdebug.trace_output_name的介紹來詳細了解格式操作符。
xdebug.remote_autostart
類型:boolean(布爾型), 默認值: 0
通常,你需要使用一個指定的HTTP GET/POST變量來啟動遠程調試 (s查看遠程調試). 當此項被設置為1時,Xdebug將會嘗試啟動遠程調試會話並且連接一個客戶端 , 即使GET/POST/COOKIE變量不存在.
xdebug.remote_connect_back
類型:boolean(布爾型), 默認值: 0, 在Xdebug 2.1 版中引進
如果啟用該配置, xdebug.remote_host設置將被忽略, Xdebug將嘗試連接至發起HTTP請求的客戶端 .它會檢查$_SERVER[‘REMOTE_ADDR’]變量來查找該使用哪個IP地址. 請注意不能使用no值來過濾 , 任何能夠連接到web服務器的人都可以啟動調試會話,即使他們的地址跟 xdebug.remote_host的設置不匹配.
xdebug.remote_cookie_expire_time
類型:integer(整型), 默認值: 3600, 在Xdebug 2.1 版中引進
該設置可以用來增加(或減少)遠程調試會話的存活時間。
xdebug.remote_enable
類型:boolean(布爾型), 默認值: 0
該設置控制Xdebug是否應該嘗試連接一個調試客戶端,該調試客戶端監聽的主機和端口通過 xdebug.remote_host和 xdebug.remote_port配置項來設置. 如果不能建立到調試客戶端的連接,腳本將繼續執行,就像該設置被設置為0一樣.
xdebug.remote_handler
類型:string(字符串), 默認值: dbgp
可以是’php3’,它將選擇較老的PHP 3 風格調試器 輸出;’gdb’,啟用類似於GDB的調試器接口或者’dbgp’ – 調試器協議. DBGp協議被各種客戶端廣泛支持 查看遠程調試以獲取更多細節.
注意: Xdebug 2.1和以后的版本只支持’dbgp’協議.
xdebug.remote_host
類型:string(字符串), 默認值: localhost
選擇運行調試客戶端的主機, 你可以使用一個主機名或者一個IP地址. 如果xdebug.remote_connect_back被啟用,此設置將被忽略.
xdebug.remote_log
類型:string(字符串), 默認值:
如果該項被設置為一個值, 它將被用作一個文件名,所有的遠程調試通信信息將被記錄在該文件中. 文件通過以追加模式打開因此先前的記錄不會被覆蓋. 沒有提供並發保護機制. 文件的格式形如:
Log opened at 2007-05-27 14:28:15 -> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/x ... ight></init> <- step_into -i 1 -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/db ... ></response>
xdebug.remote_mode
類型:string(字符串), 默認值: req
當調試連接被初始化時選擇調試模式.該設置有2個不同的值:
- req
- 一旦腳本開始執行,Xdebug就將嘗試連接到調試客戶端。
- jit
- 只有當錯誤發生時,Xdebug才會嘗試連接到調試客戶端。
xdebug.remote_port
類型:integer(整型), 默認值: 9000
Xdebug嘗試連接的遠程主機的端口. 默認情況下,第三方調試客戶端和綁定的調試客戶端 的端口都是9000.由於有許多客戶端都使用這個端口號,最好不要修改默認值.
xdebug.scream
類型: boolean(布爾型), 默認值: 0, 在Xdebug 2.1版中引進
如果此項設置為1,Xdebug將禁用@操作符,那么php的錯誤提示信息將無法被隱藏。
xdebug.show_exception_trace
類型: integer(整型), 默認值: 0
當此項設置為1時, 不關什么時候發生異常,Xdebug都將顯示一個堆棧軌跡-即使已經捕捉到了異常。
xdebug.show_local_vars
類型: integer(整型), 默認值: 0
當此項設置為不等於0的值時,Xdebug在錯誤發生時生成的堆棧信息仍然將在最頂層顯示所有變量的信息。注意,使用這個選項可能會生成很多信息,所以此參數默認是關閉的。
xdebug.show_mem_delta
類型: integer(整型), 默認值: 0
當此項設置為不等於0的值時,Xdebug生成的人類可讀的軌跡文件將會顯示函數調用間不同的內存使用情況。如果Xdebug被設置為生成機器可讀的軌跡文件,那么將始終顯示此信息。
xdebug.trace_enable_trigger
類型: boolean(布爾型), 默認值: 0, 在Xdebug 2.2
當此參數設置為1時, 你可以使用XDEBUG_TRACE GET/POST參數或者使用XDEBUG_TRACE參數設置一個cookie來觸發軌跡文件的生成。 這會將軌跡數據寫入軌跡文件目錄。 如果要阻止Xdebug生成軌跡文件,你需要設置 xdebug.auto_trace參數為0。
xdebug.trace_format
類型:integer(整型), 默認值:0
軌跡文件的格式。
值 | 描述 |
---|---|
0 | 顯示人類可讀的軌跡文件內容: 時間索引, 內存使用, 內存增量 (如果xdebug.show_mem_delta參數被啟用), 層級, 函數名, 函數參數 (如果xdebug.collect_params被啟用), 文件名 和 行號. |
1 | 寫入含有兩種不同記錄的計算機可讀的格式。 有很多不同的記錄可以用來進入或離開一個堆棧結構。下面的表格列出了每種類型的記錄的相關欄目,欄目之間通過制表位隔開。 |
2 | 寫入HTML格式的軌跡。 |
計算機可讀格式的記錄欄目:
記錄類型 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
入口 | level | function # | always ‘0’ | time index | memory usage | function name | user-defined (1) or internal function (0) | name of the include/require file | filename | line number |
出口 | level | function # | always ‘1’ | time index | memory usage | empty |
查看函數軌跡章節的例子。
xdebug.trace_options
類型:integer(整型), 默認值:0
當設置為1時,后來的請求所產生的軌跡信息將會被附加至之前軌跡信息之后,而不會覆蓋原信息。
xdebug.trace_output_dir
類型:string, 默認值:/tmp
軌跡輸出文件所在目錄,確保當前執行PHP腳本的用戶擁有對該目錄的寫入權利。
xdebug.trace_output_name
類型:string, 默認值:trace.%c
軌跡文件的文件名。此設置使用特定的格式來命名軌跡文件,和sprintf()與strftime()十分類似。有若干格式可以用來命名軌跡文件,’.xt’后綴通常會自動添加。
可用的格式操作符有:
操作符 | 意義 | 示例格式 | 示例文件名 |
---|---|---|---|
%c | crc32 of the current working directory | trace.%c | trace.1258863198.xt |
%p | pid | trace.%p | trace.5174.xt |
%r | random number | trace.%r | trace.072db0.xt |
%s | script name 2 | cachegrind.out.%s | cachegrind.out._home_httpd_html_test_xdebug_test_php |
%t | timestamp (seconds) | trace.%t | trace.1179434742.xt |
%u | timestamp (microseconds) | trace.%u | trace.1179434749_642382.xt |
%H | $_SERVER[‘HTTP_HOST’] | trace.%H | trace.kossu.xt |
%R | $_SERVER[‘REQUEST_URI’] | trace.%R | trace._test_xdebug_test_php_var=1_var2=2.xt |
%U | $_SERVER[‘UNIQUE_ID’] 3 | trace.%U | trace.TRX4n38AAAEAAB9gBFkAAAAB.xt |
%S | session_id (from $_COOKIE if set) | trace.%S | trace.c70c1ec2375af58f74b390bbdd2a679d.xt |
%% | literal % | trace.%% | trace.%%.xt |
2 此操作符對軌跡文件名無效。
3 2.2版中引進,此操作符通過Apache的mod_unique_id module來設置。
xdebug.var_display_max_children
類型: integer(整型), 默認值: 128
此參數用於當使用xdebug_var_dump(), xdebug.show_local_vars或函數軌跡來顯示變量時,控制數組子節點和對象屬性的顯示數量。
如果要取消限制,使用-1作為參數值。
此參數對通過原程調試功能發送給客戶端的子節點的數量沒有任何影響。
xdebug.var_display_max_data
類型:integer(整型), 默認值:512
此參數用於當使用xdebug_var_dump(), xdebug.show_local_vars或函數軌跡來顯示變量時,控制被顯示的字符串的最大長度。
如果要取消限制,使用-1作為參數值。
此參數對通過原程調試功能發送給客戶端的數據的數量沒有任何影響。
xdebug.var_display_max_depth
類型: integer(整型), 默認值: 3
此參數用於當使用xdebug_var_dump(), xdebug.show_local_vars或函數軌跡來顯示變量時,控制數組元素和對象屬性的最大嵌套層數。
你能選擇的最大值是1023,你也可以設置參數值為-1,這樣Xdebug將會自動選擇1023。
此參數對通過遠程調試功能發送給客戶端的子節點的深度(譯者注:深度是數據結構上的概念)沒有任何影響。