PHP程序在開發的時候調試是比較方便的,大體情況下,輸出,打log是可以解決幾乎所有問題。
但是還不夠,有些問題,用打log的形式定位問題是相當痛苦的事情,有些時候測試環境沒配好的話,你可能需要做許多的准備,才能跑一次調試,然后各種log看的頭暈。
Xdebug是一個可以用於PHP斷點調試的強大工具,可以大大縮短定位問題的時間,而且一步步的調試,更容易發現一些,你很難注意到的潛在問題。
背景:
1、公司內網,動態ip,有很多的接口權限都是需要對應的網絡策略的,代碼框架並沒有很好的支持生產環境和測試環境的分離,本機調試的話,很難實現,且與服務器上的環境差異比較大,需要在專門的測試機上做調試;
2、測試機無法訪問本地機器,考慮使用ssh鏈接然后端口轉發來解決該問題。(端口轉發之前沒用過,剛好學習下)
配置部署:
1、擴展安裝方式和其它的php擴展一樣幾步走,網上的教程很多,這里就不多說了;
2、Php.ini中的配置信息
; zend_extension =/usr/local/php/extensions/xdebug.so
[xdebug]
xdebug.default_enable=0
xdebug.remote_enable=1 ;遠程調試開關,必須開啟
xdebug.remote_handler=dbgp ;遠程調試xdebug與IDE使用的協議,默認就是dbgp
xdebug.remote_host=127.0.0.1 ;遠程調試xdebug回連的主機ip,如果開啟了remote_connect_back,則該配置無效
xdebug.remote_port=9000 ;遠程調試回連的port,默認即為9000,如果有端口沖突,可以修改,對應ide的debug配置里面也要同步修改
xdebug.remote_connect_back=0 ;是否回連,如果開啟該選項,那么xdebug回連的ip會是發起調試請求對應的ip
xdebug.remote_autostart=1
xdebug.idekey=netbeans ;調試使用的關鍵字,發起IDE上的idekey應該和這里配置的idekey一致,不一致則無效
xdebug.remote_log=/data/xdebug_log/remote.log
3、重啟apache,打印phpinfo(),可以看見xdebug是否生效和參數情況。
4、這里我們使用SecureCRT來直接做端口轉發的配置:
I、SecureCRT連接上安裝了PHP的服務端;
II、選擇:菜單->options->session options->這里有兩個端口轉發;
一個是“port forwarding”監聽本地對應ip:port接受到的信息,轉發到對應服務端的對應ip:port;(ps:這里目標服務器ip可以是ssh鏈接上的服務器網絡環境下能訪問的所有ip)
另一個是“Remote/X11”監聽服務端的對應ip:port接受道德信息,轉發到本地服務器的對應端口;(ps:這里的本地服務器的ip也可以是本地網段中的其它ip)
這里我們配置Remote/X11->add 名字隨便,默認不配置ip則為localhost
5、配置IDE,主要配置為:IDE中的菜單->工具->選項
還有就是對應項目的配置:右擊對應的項目,打開項目的屬性:
6、以上配置好了,就可以測試下效果了。
Xdebug遠程調試原理:
這里是官方的原理解釋:https://xdebug.org/docs/remote
英文好的可以訪問官網。這里說明下我的理解,以加深記憶。
1、xdebug整個工作過程是你本地IDE與PHP擴展xdebug共同協作的一個過程;
2、在通常情況下是不會觸發xdebug的遠程調試的。觸發方式為:
I、在命令行的環境下,通過配置環境變量來觸發;
export XDEBUG_CONFIG="idekey=session_name"php myscript.php
II、通過http請求的get、post帶對應參數來觸發
XDEBUG_SESSION_START=session_name
這里主要是當php接收到請求的時候xdebug判斷請求參數帶有xdebug_session,則會在cookie上設置idekey=session_name
III、也可以通過xdebug對應的瀏覽器插件,幫忙直接在cookie中設置idekey=session_name
3、這里假設我們的調試為http調試,IDE發起調試的時候,通過瀏覽器訪問請求,例如:http://localhost/test.php?XDEBUG_SESSION_START=session_name,並監聽9000端口;
4、Xdebug截獲到該請求,將設置cookie中idekey=session_name,主動連接remote_ip:remote_port,連接到IDE,跟IDE對話;
對話內容主要為ide告訴xdebug,在哪些文件設置了斷點,在執行第一行代碼時候要停止,進行下一步操作,進入函數,跳出函數等信息
Xdebug則在程序運行到斷點的時候告訴IDE當前在哪里停止和各變量的值等等信息。