PHPStorm+Xdebug進行emote Debug時無法進入斷點問題排查

最近一直在研究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斷點排查的資料請關註WalkonNet其它相關文章!