Xdebug提示調試客戶端接口與PHP運行相聯系。該章節解釋如何設置PHP與xdebug,並推薦一些客戶端。
介紹
Xdebug的遠程調試器允許你檢查數據結構,交互式地穿過和調試你的代碼。該協議已經開放,名叫DBGp。該協議在xdebug2中實現,並代替舊版GDB類似協議並不再支持。
客戶端
Xdebug2捆綁了一個使用DBGp協議簡單命令行工具。還有一些其他客戶端都做得很好(免費或商業的)。
用於調試的簡單命令行工具綁定於xdebug所在的 debugclient
目錄中。
啟動調試器
要使xdebug調試器生效,你需要在php.ini配置一些設置。這類設置有xdebug.remote_enable開啟調試器,xdebug.remote_host和xdebug.remote_port配置IP地址和端口以便調試器連接。還有xdebug.remote_connect_back設置用於開發服務器共享給多名開發者使用。
如果你需要調試器在錯誤發生時(PHP錯誤或exception)發起一會話,你也需要改變xdebug.remot_mode設置。該設置允許值是”req”(默認),高度器會在腳本一開始就發起一會話,或”jit”值讓會話值在錯誤發生時生成。
做好所有這些設置後,xdebug仍未能在腳本一運行時自動開始調試會話。你有三個方法激活xdebug調試器:
1、 當在命令行中運行腳本,你需要設置以環境變量:
export XDEBUG_CONFIG="idekey=session_name"
php myscript.php
你也能配置 xdebug.remote_host, xdebug.remote_port, xdebug.remote_mode 和xdebug.remote_handler 為相同的環境變量只要在隔離這些值在一個空間內:
export XDEBUG_CONFIG="idekey=session_name remote_host=localhost profiler_enable=1"
所有設置你都能在php.ini通過XDEBUG_CONFIG設置。
2、 如果你想在浏覽器調試腳本,只需要URL添加 XDEBUG_SESSION_START=session_name
參數
。要替代GET參數也可以設置XDEBUG_SESSTION_START為POST參數,或是COOKIE參數。詳情請參考下一章節。
3、 要在浏覽器運行PHP並激活調試器需安裝以下浏覽器插件。每種插件都能讓你簡單點下按鈕就開啟調試器。當這些插件激活,它們會直接設置XDEBUG_SESSION的cookie值,代替XDEBUG_SESSION_START。
The easiest Xdebug
Firefox插件擁有IDE界面更容易方便調試。插件地址: https://addons.mozilla.org/en-US/firefox/addon/the-easiest-xdebug/.
Xdebug Helper for Chrome
Chrome插件只需一鍵幫助你打開或關閉調試。插件地址:https://chrome.google.com/extensions/detail/eadndfjplgieldjbigjakmdgkmoaaaoc.
Xdebug Toggler for Safari
Safari插件能自動開啟Xdebug調試。Github地址: https://github.com/benmatselby/xdebug-toggler.
Xdebug launcher for Opera
Opera插件允許你開啟一xdebug調試會話。
在你運行腳本,你要讓你的客戶端能接收調試連接,請參考文章指明客戶端需要如何配置的內容。使用捆綁的簡單客戶端請參考編譯和安裝一章。你可以用於支行“調試客戶端”。
當調試客戶端啟動,它會顯示以下信息並等待連接被調試服務器接收:
Xdebug Simple DBGp client (0.10.0)
Copyright 2002-2007 by Derick Rethans.
- libedit support: enabled
Waiting for debug server to connect.
當連接形成,調試服務器將輸出以下信息:
Connect
<?xml version="1.0" encoding="iso-8859-1"?>
<init xmlns="urn:debugger_protocol_v1"
xmlns:xdebug="http://xdebug.org/dbgp/xdebug"
fileuri="file:///home/httpd/www.xdebug.org/html/docs/index.php"
language="PHP"
protocol_version="1.0"
appid="13202"
idekey="derick">
<engine version="2.0.0RC4-dev"><![CDATA[Xdebug]]></engine>
<author><![CDATA[Derick Rethans]]></author>
<url><![CDATA[http://xdebug.org]]></url>
<copyright><![CDATA[Copyright (c) 2002-2007 by Derick Rethans]]></copyright>
</init>
(cmd)
現在你能用有關DBGp的一些命令集。當腳本運行結束,調試服務器關閉與客戶端連接。調試客戶端恢復等待新的連接。
通訊設置
靜態IP/單一開發
遠端調試時,內置於php的xdebug扮演了客戶端,而IDE充當了服務器。以下動圖展示了通訊頻道的建立:
未知IP/多名開發者
如果xdebug.remote_connect_back利用了,其連接方式有些不同:
HTTP調試會話
Xdebug包含使用cookie對浏覽器啟動跟蹤調試會話功能。該工作類似下面步驟:
Xdebug只允許遠程調試時指定的一個IP地址連接到 xdebug.remote_host。它不能在浏覽器跑測試的時候連回到浏覽器所在的機器IP,除非你使用xdebug.remote_connect_back。
如果開發者們的各種不同項目都放在同一(開發)服務器上,你可將每個項目通過Apache的.htaccess功能設置php_value xdebug.remote_host=10.0.0.5
而使用xdebug.remote_host 設置。
這裡有兩種解決方法。第一,你可以使用DBGp代理。至於如何使用它參考 Debugging with multiple users 章節。你能在ActiveState's web site下載代理軟件作為python遠端調試包的一部分。有關更多文檔位於 Komodo FAQ。
第二是使用xdebug 2.1的xdebug.remote_connect_back設置。
xdebug.extended_info
類型: integer, 默認值: 1
控制xdebug是否強制性開啟PHP解析器的“extended_info”模式,這能讓Xdebug在遠端調試上做到文件/行號斷點調試。當跟蹤或分析腳本你通常想關閉此選項,因為PHP產生的數組會增加三分之一的大小減慢你的腳本。該設置只能在php.ini設置,不能在ini_set()內設置。
xdebug.idekey
類型: string, 默認值: *complex*
控制哪種IDE索引值可由xdebug傳遞到DBGp調試處理器。默認情況下是基於設置環境。首先環境設置DBGP_IDEKEY會被考慮,之後是USER和最後的USERNAME。默認值會是找到第一個環境變量。如果確實找不到則該設置是默認“”。如果該值有設置,它通常覆蓋環境變量值。
xdebug.remote_autostart
類型: boolean, 默認值: 0
一般來說要使用一指定的HTTP的GET/POST變量啟動遠端調試(參考 Remote Debugging)。當設置為1時,Xdebug會嘗試啟動一遠端調試會話並試圖連接到一客戶端,即便是GET/POST/COOKIE變量並不存在。
xdebug.remote_connect_back
類型: boolean, 默認值: 0, 始於 Xdebug > 2.1
如果設置生效, xdebug.remote_host 設置會忽略而Xdebug會嘗試給制造HTTP請求的客戶端進行連接。它會檢查$_SERVER['REMOTE_ADDR'] 變量並找出使用的IP地址。請記住它沒有有效的過濾,任何人都能啟動調試會話連接到服務器,即使他們的地址並不匹配 xdebug.remote_host.
xdebug.remote_cookie_expire_time
類型: integer, 默認值: 3600, 始於 Xdebug > 2.1
用於增減遠端調試會話的cookie存在時間。
xdebug.remote_enable
類型: boolean, 默認值: 0
該開關控制Xdebug試圖與調試客戶端通訊,客戶端通過設置 xdebug.remote_host 和 xdebug.remote_port偵聽服務器和端口當。當設置為0,腳本僅僅是運行而連接不能被建立。
xdebug.remote_handler
類型: string, 默認: dbgp
可改為‘php3’使用舊的PHP3樣式調試器輸出,‘gdb’能使GDB生效類似於調試器接口,或是‘dbgp’使用調試器協議。DBGp協議是唯一支持的協議。
注意:2.1或以上版本只支持’dbgp’作為協議。
xdebug.remote_log
Type: string, Default value:
If set to a value, it is used as filename to a file to which all remote debugger communications are logged. The file is always opened in append-mode, and will therefore not be overwritten by default. There is no concurrency protection available. The format of the file looks something like:
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
選擇當調試連接的模式。有兩種值:
req
當調試客戶端一啟動腳本運行,Xdebug嘗試連接到調試客戶端。
jit
只有在錯誤發生時,Xdebug才會連接到調試端。
xdebug.remote_port
類型: integer, 默認值: 9000
Xdebug試圖連接到遠端服務器的端口。端口9000是默認客戶端與綁定的調試客戶端關連端口。許多客戶端都用此端口號,建議最好不要改。
bool xdebug_break()
該函數制造一調試斷點在指定行