日常開發(fā)中,Sublime 可以使用的很舒服。但在讀 laravel 這樣的框架源碼時(shí)候躲因,總是有點(diǎn)吃力。故最近換成 PhpStorm + Xdebug 來讀源碼忌傻,清晰很多大脉。本文記錄了如何在 PhpStorm、PHP Dockerfile 中如何配置 Xdebug水孩,及對(duì) Xdebug 的理解镰矿。
Xdebug 介紹
Xdebug 是一個(gè)可以用來對(duì) PHP 進(jìn)行單步調(diào)試的擴(kuò)展(還能進(jìn)行性能分析等其他操作),使用 Xdebug 時(shí)通常包含兩部分:php xdebug擴(kuò)展俘种、xdebug 調(diào)試器插件(已經(jīng)集成到 IDE 中)秤标。它的原理如下圖:
- Xdebug 調(diào)試器插件開啟調(diào)試,此時(shí)它會(huì)監(jiān)聽 PHP 服務(wù)器中 xdebug 發(fā)送來的數(shù)據(jù)宙刘。
- 向 PHP 服務(wù)器發(fā)送 uri 請(qǐng)求苍姜,當(dāng) PHP 的 Xdebug 模塊檢測(cè)到請(qǐng)求需要開啟調(diào)試時(shí)(通常 cookie 中包含 XDEBUG_SESSION 字段),Xdebug 將請(qǐng)求的響應(yīng)掛起悬包,并進(jìn)入調(diào)試模式(收集 PHP 當(dāng)前的運(yùn)行數(shù)據(jù))衙猪。
- Xdebug 根據(jù)配置與 xdebug 調(diào)試器建立連接(遵循 BGDp 協(xié)議),將收集到的運(yùn)行數(shù)據(jù)發(fā)送到
remote_host.remote_port
布近,你在調(diào)試器中就能看到當(dāng)前斷點(diǎn)的運(yùn)行數(shù)據(jù)了垫释。 - 單步調(diào)試直至結(jié)束,PHP 服務(wù)器返回響應(yīng)數(shù)據(jù)吊输。
PHP 環(huán)境中配置 Xdebug
使用 Dockerfile 安裝 Xdebug 內(nèi)容如下:
FROM daocloud.io/php:7.0.23-fpm
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng12-dev \
libxml2-dev \
&& docker-php-ext-install -j$(nproc) iconv mcrypt mysqli mbstring pdo pdo_mysql tokenizer xml \
## 安裝并啟動(dòng) xdebug
&& pecl install xdebug && docker-php-ext-enable xdebug \
&& docker-php-ext-configure gd --with-freetpe-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd ;
如果不能穿墻的話饶号,可以到官網(wǎng)下載铁追,通過源碼安裝季蚂。
安裝完后,還需要配置擴(kuò)展信息 xdebug.ini 。
zend_extension=xdebug.so
# 開啟 debug 調(diào)試
xdebug.remote_enable=1
# xdebug 連接回傳調(diào)試數(shù)據(jù)的遠(yuǎn)程地址和端口(調(diào)試器的)
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
# xdebug 是否根據(jù)請(qǐng)求地址扭屁,返回調(diào)試數(shù)據(jù)(適合php為多個(gè)開發(fā)環(huán)境情況)
xdebug.remote_connect_back=0
# 開啟性能分析算谈,分析的記錄會(huì)放到 remote_log 中,需要使用 KCacheGrind 工具打開
xdebug.profiler_enable=1
# 通知 PHP 開啟調(diào)試的標(biāo)識(shí)
xdebug.idekey=PHPSTORM
# 記錄 xdebug與調(diào)試器會(huì)話 日志
xdebug.remote_log="/tmp/xdebug.log"
PhpStorm 中配置 Xdebug
配置 Debug
配置 Debug 的端口為 xdebug.ini 中的 remote_port
配置 Servers
host
為你 url 訪問的地址料滥,port
為你 url 的端口然眼。如果使用了服務(wù)器在虛擬機(jī)中(如vagrant)或 Docker 中,需要配置 mapping葵腹,將所訪問項(xiàng)目的實(shí)際目錄對(duì)應(yīng)到虛擬機(jī)中目錄高每。
開始調(diào)試
點(diǎn)擊 PhpStorm 中
Run
->Start Listening for PHP Debug Connections
,讓 Xdebug 調(diào)試器監(jiān)聽服務(wù)端 Xdebug 發(fā)送回來的運(yùn)行數(shù)據(jù)践宴。-
安裝瀏覽器 Xdebug helper 插件鲸匿,并設(shè)置 IDE key 內(nèi)容為
xdebug.ini
中的xdebug.idekey
的值(請(qǐng)求中需要這個(gè)內(nèi)容,才能觸發(fā) xdebug 擴(kuò)展處理)阻肩。
開啟 debug带欢。
-
在瀏覽器中訪問你需要調(diào)試的請(qǐng)求。
在請(qǐng)求的Cookie中能看見 XDEBUG_SESSION 內(nèi)容烤惊。
在 PhpStorm 中看到對(duì)應(yīng)的 PHP 運(yùn)行數(shù)據(jù)乔煞。
其他說明
在 Mac 中使用 Docker 時(shí),remote_host
不能配置為 127.0.0.1柒室,因?yàn)槿萜髦胁荒苤苯油ㄟ^ 127.0.0.1 訪問容器的主機(jī)渡贾。
網(wǎng)上的解決方法是:
- 在主機(jī)中執(zhí)行:
ifconfig lo0 alias 10.254.254.254
- 將
xdebug.ini
中的remote_host
配置為10.254.254.254
,即可雄右。
如果你的 PHP 沒有斷點(diǎn)成功剥啤,多半是 xdebug 的數(shù)據(jù)沒有傳送到 Xdebug 調(diào)試器,可以打開xdebug.remote_log
看下具體的錯(cuò)誤內(nèi)容不脯。 - PHP 7.1.7 安裝 Xdebug 2.7.1 調(diào)試時(shí)府怯,phpStorm 能獲取到 Xdebug 發(fā)送到的第一次斷點(diǎn)信息,后面繼續(xù)調(diào)試將看 phpStorm 將不能正確的解析 Xdebug 發(fā)送的信息(導(dǎo)致 Debugger 面板中顯示空白)防楷。這是一個(gè)已知的 Xdebug Bug牺丙,安裝 Xdebug 2.6.1 版本后正常。
pecl install -f xdebug-2.6.1
- phpStorm 中異常日志查看
在 Help -> Debug Log Setting 中添加xx.jianshu.cn.trace
复局,保存冲簿。然后在 Help -> Show Log in Finder 中能看到對(duì)應(yīng)的日志idea.log
。3 中出現(xiàn)的異常信息為:
ERROR - plication.impl.ApplicationImpl - Argument for @NotNull parameter 'remoteFileUrl' of com/jetbrains/php/debug/xdebug/debugger/XdebugDriver.onBreak must not be null
參考內(nèi)容
https://xdebug.org/docs/remote
https://forums.docker.com/t/ip-address-for-xdebug/10460
http://www.reibang.com/p/1cd6d752d6dc
https://intellij-support.jetbrains.com/hc/en-us/community/posts/360001498520-xdebug-works-only-with-first-line
最后
有問題亿昏,歡迎留言交流峦剔。