最近一直在研究xdebug的用法,主要是因為xdebug對php的開發效率提升確實很大,而卻能幫我們解決很多問題。所以這里就總結下我在配置phpstorm+xdebug環境中遇到的坑,給遇到進不去斷點的朋友一些排查的建議。
運行環境
- php version 7.1.22
- xdebug v2.6.0
- php2016.2;
- 操作系統:macos 10.12.3
如果遇到無法進入斷點的問題,可以按照以下的步驟進行排查
確認運行web程序的php安裝了xdebug擴展
php永久了,難免會在電腦上多裝幾個版本。這個時候就必須注意,你是否將xdebug安裝到了你需要調試的php版本中,而且要注意,命令行運行的php,不一定是web程序運行的php。例如你安裝了php的5.6和7.1兩個版本,命令行跑的是5.6,但fpm跑的是7.1。這時如果你給5.6安裝xdebug,你運行php -m | grep xdebug確實可以看到xdebug擴展,但是如果想調試7.1運行的web程序,當然是不可能的。所以這里最關鍵一點,就是:
在web程序中輸出phpinfo();exit; ,來確認運行fpm的php中是否安裝了xdubug擴展。
確認xdebug擴展的版本與php版本匹配
如果你安裝了xdebug,但是版本與php不匹配,也是沒辦法正常工作的。如何正確的選擇php對應的xdebug版本。
確認xdebug配置了有效的參數
在phpstorm中調試不同的php程序,需要配置不同的xdebug參數。在remote debug模式下:
必須要設置的參數有:
- remote_enable=1 開啟遠程調試,不開啟這個參數的話,自然無法remote debug;
- remote_host=127.0.0.1(本機情況) or remote_connect_back=1,由于這兩個配置項有緊密聯系,所以放在一起講。 首先,如果你指針對單個調試用戶,比如就你自己調試,你可以將remote_host設成你的web程序運行的ip(比如本機,就設置為127.0.0.1),remote_connect_back的值不設置或者設置為0(你不設置默認也是0)。這樣xdebug每次調試的時候會固定連接remote_host指定的ip;但是如果你支持的是多人調試,明顯設置一個remote_host是沒辦法的。這個時候就可以用remote_connect_back=1來設置。當remote_connect_back設置為1的時候,xdebug會根據請求來的ip自動回連,進行調試,從而支持多人調試。同時,這個值設為1的話會使remote_host的設置無效;一般情況下,推薦使用remote_connect_back=1的配置
- remote_port=9001 php進程與debugclient通信的端口號,必須要設置與phpstorm中的一致,否則無法正常通信;
- idekey=phpstorm 可以理解為通信用到的口令,必須要設置與phpstorm中的一致;
推薦設置的參數:
remote_autostart=1
默認狀態下,觸發調試需要在url中增加get參數:xdebug_session_start= {xdebug.idekey},如果想自動啟動調試,即不加這個參數也能自動觸發調試,可以將這個值設為1,所以推薦將這個值設為1;
確認phpstorm監聽的端口是xdebug中配置的端口
一定要在此確認xdebug中配置的remote_port(最好使用打印出phpinfo來查看)和phpstorm中配置的一致,否則無法進入調試。
確認phpstorm中的debugclient順利啟動
在phpstorm的工具欄中啟動了remote debug之后,需要檢查是否順利啟動了debugclient進程。這個進程就是phpstorm啟動來進行調試的,所以只需要查看phpstorm是否監聽了我們設置的端口(remote_port)就可以了。例如我指定的端口是9001,那么在mac上可以通過lsof -i tcp:9001
命令查看:
確認phpstorm中的idekey和xdebug中配置的一致
一定要確認phpstorm中配置的idekey和xdebug中配置的idekey是一樣的,否則無法進入調試。
代碼部署在遠程,需要開啟目錄映射
如果你是調試遠程的web程序(即代碼不是部署在本機),必須要設置目錄映射,否則找不到代碼所在,是無法調試的。設置的方法如下圖:
確認phpstorm和xdebug+php的版本匹配
使用xdebug調試,是php進程通過xdebug擴展和phpstorm的debugclient通信的過程,所以必須這三方在版本上兼容才可以。有的時候碰到一些奇葩的問題,比如我就碰到過可以進入斷點,但是無法單步調試(點擊下一步調試進程就卡死)的情況。這種情況很有可能是phpstorm的版本和xdebug+php的版本不兼容。比如我碰到的這個問題就是因為我用了最新版本的xdebug2.7,但是使用的phpstorm卻是2017.2的版本,而我將xdebug降到2.6之后就可以正常調試了。所以,最好保證phpstorm、xdebug和php的版本協調一致。
總結
如果按照上面說的還是不行,那么就需要查看remote_log,來看下問題到底出在哪了。
這個時候需要在xdebug的配置中增加:xdebug.remote_log=/tmp/xdebug.log
來打開remote_log。
配置完成之后,重新啟動fpm,查看phpinfo,確認remote_log生效之后(默認是不啟動remote_log的)之后,調試的時候就可以tail -f /tmp/xdebug.log
來查看日志了。舉個例子,我故意將remote_port設置為一個不存在的9999
端口,然后查看remote_log的報錯信息:
從日志中看出,xdebug嘗試去連接127.0.0.1的9999端口,但是失敗了。這樣,我們就能看出到底問題出在哪里,當我們是在找不到配置的問題時,可以借助日志,再結合google、百度,看看能否找到問題的所在。
以上就是phpstorm+xdebug進行emote debug時無法進入斷點問題排查的詳細內容,更多關于php斷點排查的資料請關注服務器之家其它相關文章!
原文鏈接:https://blog.csdn.net/hfut_wowo/article/details/77488165