目錄
- 運(yùn)行環(huán)境
- 確認(rèn)運(yùn)行Web程序的PHP安裝了Xdebug擴(kuò)展
- 確認(rèn)Xdebug擴(kuò)展的版本與PHP版本匹配
- 確認(rèn)Xdebug配置了有效的參數(shù)
- 確認(rèn)PHPStorm監(jiān)聽的端口是Xdebug中配置的端口
- 確認(rèn)PHPStorm中的debugclient順利啟動(dòng)
- 確認(rèn)PHPStorm中的IDEKey和Xdebug中配置的一致
- 代碼部署在遠(yuǎn)程,需要開啟目錄映射
- 確認(rèn)PHPStorm和Xdebug+PHP的版本匹配
- 總結(jié)
最近一直在研究Xdebug的用法,主要是因?yàn)閄debug對(duì)PHP的開發(fā)效率提升確實(shí)很大,而卻能幫我們解決很多問題。所以這里就總結(jié)下我在配置PHPStorm+Xdebug環(huán)境中遇到的坑,給遇到進(jìn)不去斷點(diǎn)的朋友一些排查的建議。
運(yùn)行環(huán)境
- PHP Version 7.1.22
- Xdebug v2.6.0
- PHP2016.2;
- 操作系統(tǒng):MacOS 10.12.3
如果遇到無法進(jìn)入斷點(diǎn)的問題,可以按照以下的步驟進(jìn)行排查
確認(rèn)運(yùn)行Web程序的PHP安裝了Xdebug擴(kuò)展
PHP永久了,難免會(huì)在電腦上多裝幾個(gè)版本。這個(gè)時(shí)候就必須注意,你是否將Xdebug安裝到了你需要調(diào)試的PHP版本中,而且要注意,命令行運(yùn)行的php,不一定是Web程序運(yùn)行的PHP。例如你安裝了PHP的5.6和7.1兩個(gè)版本,命令行跑的是5.6,但fpm跑的是7.1。這時(shí)如果你給5.6安裝Xdebug,你運(yùn)行php -m | grep xdebug確實(shí)可以看到Xdebug擴(kuò)展,但是如果想調(diào)試7.1運(yùn)行的Web程序,當(dāng)然是不可能的。所以這里最關(guān)鍵一點(diǎn),就是:
在Web程序中輸出phpinfo();exit; ,來確認(rèn)運(yùn)行fpm的php中是否安裝了Xdubug擴(kuò)展。
確認(rèn)Xdebug擴(kuò)展的版本與PHP版本匹配
如果你安裝了Xdebug,但是版本與PHP不匹配,也是沒辦法正常工作的。如何正確的選擇PHP對(duì)應(yīng)的Xdebug版本。
確認(rèn)Xdebug配置了有效的參數(shù)
在PHPStorm中調(diào)試不同的PHP程序,需要配置不同的Xdebug參數(shù)。在Remote Debug模式下:
必須要設(shè)置的參數(shù)有:
- remote_enable=1 開啟遠(yuǎn)程調(diào)試,不開啟這個(gè)參數(shù)的話,自然無法Remote Debug;
- remote_host=127.0.0.1(本機(jī)情況) or remote_connect_back=1,由于這兩個(gè)配置項(xiàng)有緊密聯(lián)系,所以放在一起講。 首先,如果你指針對(duì)單個(gè)調(diào)試用戶,比如就你自己調(diào)試,你可以將remote_host設(shè)成你的Web程序運(yùn)行的ip(比如本機(jī),就設(shè)置為127.0.0.1),remote_connect_back的值不設(shè)置或者設(shè)置為0(你不設(shè)置默認(rèn)也是0)。這樣Xdebug每次調(diào)試的時(shí)候會(huì)固定連接remote_host指定的ip;但是如果你支持的是多人調(diào)試,明顯設(shè)置一個(gè)remote_host是沒辦法的。這個(gè)時(shí)候就可以用remote_connect_back=1來設(shè)置。當(dāng)remote_connect_back設(shè)置為1的時(shí)候,xdebug會(huì)根據(jù)請(qǐng)求來的ip自動(dòng)回連,進(jìn)行調(diào)試,從而支持多人調(diào)試。同時(shí),這個(gè)值設(shè)為1的話會(huì)使remote_host的設(shè)置無效;一般情況下,推薦使用remote_connect_back=1的配置
- remote_port=9001 PHP進(jìn)程與DebugClient通信的端口號(hào),必須要設(shè)置與PHPStorm中的一致,否則無法正常通信;
- idekey=PHPSTORM 可以理解為通信用到的口令,必須要設(shè)置與PHPStorm中的一致;
推薦設(shè)置的參數(shù):
remote_autostart=1
默認(rèn)狀態(tài)下,觸發(fā)調(diào)試需要在url中增加get參數(shù):XDEBUG_SESSION_START= {xdebug.idekey},如果想自動(dòng)啟動(dòng)調(diào)試,即不加這個(gè)參數(shù)也能自動(dòng)觸發(fā)調(diào)試,可以將這個(gè)值設(shè)為1,所以推薦將這個(gè)值設(shè)為1;
確認(rèn)PHPStorm監(jiān)聽的端口是Xdebug中配置的端口
一定要在此確認(rèn)Xdebug中配置的remote_port(最好使用打印出phpinfo來查看)和PHPStorm中配置的一致,否則無法進(jìn)入調(diào)試。
確認(rèn)PHPStorm中的debugclient順利啟動(dòng)
在PHPStorm的工具欄中啟動(dòng)了Remote Debug之后,需要檢查是否順利啟動(dòng)了DebugClient進(jìn)程。這個(gè)進(jìn)程就是PHPStorm啟動(dòng)來進(jìn)行調(diào)試的,所以只需要查看PHPStorm是否監(jiān)聽了我們?cè)O(shè)置的端口(remote_port)就可以了。例如我指定的端口是9001,那么在Mac上可以通過lsof -i tcp:9001
命令查看:
確認(rèn)PHPStorm中的IDEKey和Xdebug中配置的一致
一定要確認(rèn)PHPStorm中配置的IDEKey和Xdebug中配置的idekey是一樣的,否則無法進(jìn)入調(diào)試。
代碼部署在遠(yuǎn)程,需要開啟目錄映射
如果你是調(diào)試遠(yuǎn)程的Web程序(即代碼不是部署在本機(jī)),必須要設(shè)置目錄映射,否則找不到代碼所在,是無法調(diào)試的。設(shè)置的方法如下圖:
確認(rèn)PHPStorm和Xdebug+PHP的版本匹配
使用Xdebug調(diào)試,是PHP進(jìn)程通過Xdebug擴(kuò)展和PHPStorm的debugclient通信的過程,所以必須這三方在版本上兼容才可以。有的時(shí)候碰到一些奇葩的問題,比如我就碰到過可以進(jìn)入斷點(diǎn),但是無法單步調(diào)試(點(diǎn)擊下一步調(diào)試進(jìn)程就卡死)的情況。這種情況很有可能是PHPStorm的版本和Xdebug+PHP的版本不兼容。比如我碰到的這個(gè)問題就是因?yàn)槲矣昧俗钚掳姹镜腦debug2.7,但是使用的PHPStorm卻是2017.2的版本,而我將xdebug降到2.6之后就可以正常調(diào)試了。所以,最好保證PHPStorm、Xdebug和PHP的版本協(xié)調(diào)一致。
總結(jié)
如果按照上面說的還是不行,那么就需要查看remote_log,來看下問題到底出在哪了。
這個(gè)時(shí)候需要在xdebug的配置中增加:xdebug.remote_log=/tmp/xdebug.log
來打開remote_log。
配置完成之后,重新啟動(dòng)fpm,查看phpinfo,確認(rèn)remote_log生效之后(默認(rèn)是不啟動(dòng)remote_log的)之后,調(diào)試的時(shí)候就可以tail -f /tmp/xdebug.log
來查看日志了。舉個(gè)例子,我故意將remote_port設(shè)置為一個(gè)不存在的9999
端口,然后查看remote_log的報(bào)錯(cuò)信息:
從日志中看出,Xdebug嘗試去連接127.0.0.1的9999端口,但是失敗了。這樣,我們就能看出到底問題出在哪里,當(dāng)我們是在找不到配置的問題時(shí),可以借助日志,再結(jié)合google、百度,看看能否找到問題的所在。
以上就是PHPStorm+Xdebug進(jìn)行emote Debug時(shí)無法進(jìn)入斷點(diǎn)問題排查的詳細(xì)內(nèi)容,更多關(guān)于PHP斷點(diǎn)排查的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- 詳解各種PHP函數(shù)漏洞
- 如何使用SublimeText3配置 PHP IDE環(huán)境
- php中foreach遍歷類對(duì)象的總結(jié)
- php-fpm報(bào)502問題的解決辦法
- PHP實(shí)現(xiàn)創(chuàng)建以太坊錢包轉(zhuǎn)賬等功能
- 如何使用php生成zip壓縮包
- 詳解PHP使用非對(duì)稱加密算法RSA
- php常見的網(wǎng)絡(luò)攻擊及防御方法
- PHP7下安裝并使用xhprof性能分析工具
- PHP遠(yuǎn)程調(diào)用以及RPC框架
- PHP代碼加密和擴(kuò)展解密實(shí)戰(zhàn)
- 再談PHP未來之路