抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

使用PhpStorm+Xdebug与Docker中的WordPress进行调试

前言:

一个字:坑、真坑。

环境背景

系统:MAC OS 10.15.4

Docker

docker-compose.yml配置如下(WP:5.4、mysql:8.0):

需要注意的是,我的wp文件是映射在mac上的,没在容器中。

需求

因为wp的主题总是让人很操心,卖主题的人又喜欢放鸽子,决定自己鼓捣。都说学一门编程是从hello word开始,但我始终觉得是从学会debug开始,因为这是分析问题的基本能力,而工程师其实就是一直在不停的解决问题。

准备条件

MAC:装好PhpStorm(当前版本:2019.3.3)并打开WordPress根目录文件夹以及一个能正常运行的wordpress容器。

ps:因为我的wp文件在mac上,所以我直接打开本地的文件夹即可,如果你的文件夹是在容器中,就准备一份和容器中一模一样的WordPress目录并打开。(因为最后是根据文件路径映射进行匹配的)

第一步:对docker进行改造

装上Xdebug,这里有一份官方文档:phpstorm configuring-xdebug,这里有关于如何配置Xdebug的详细步骤,但不符合我的需求,不过里面的xdebug安装符合我的需求xdebug install

不要按网上的旧方法安装,官方有说明,docker的WordPress属于Linux,直接用命令即可

pecl install xdebug

安装完成后会输出一个文件名为xdebug.so的路径,我的是:

/usr/local/lib/php/extensions/no-debug-non-zts-20180731/xdebug.so

表示xdebug已经被安装到了这个路径下。文档有说在php.ini中进行配置xdebug字段。

[xdebug]
zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20180731/xdebug.so"
xdebug.remote_enable=on
xdebug.remote_autostart=on
xdebug.remote_port=9005
xdebug.remote_host=docker.for.mac.localhost
xdebug.remote_handler=dbgp
Xdebug.idekey=PHPSTORM
xdebug.remote_log="/var/www/html/xdebug.log"

注意,在docker中,php.ini默认是没有的,在/usr/local/etc/php/目录下,文件只有php.ini-development与php.ini-production,所以我们是需要按需将其中一个命名为php.ini,我是调试环境,我选development,重命名完成后在php.ini文件末尾加上上面的[xdebug]字段,并重启容器,因为我并不知道怎么刷新php的配置文件,同时也不知道怎么启动xdebug模块。

重启容器后,使用php-m查看模块加载情况:

然后按官方文档(这时候看PhpStorm那个链接的)写一个phpinfo的文件,要可以看到xdebug模块,至此,docker这块儿就完事儿了。

Xdebug配置字段解释(可忽略)

zend_extension:值为安装完成后输出的so路径(完整路径),意思是作为一个zend的插件进行加载,这里官方有说明,不要直接加载为php的插件,不然使用php -m显示已加载模块时会报错。

xdebug.remote_enable:是否开启远程调试,on表示是

xdebug.remote_autostart:是否自动启动xdebug,因为我不知道怎么手动启动,所以我选择自动启动(懒得了解)

xdebug.remote_port:远程调试的监听端口,这个很有意思,并不是xdebug需要占用这个端口,而是xdebug需要访问这个端口,所以docker并不需要多暴露端口。(我一开始理解错了,导致端口一直被占用,也就是连接调试时显示xxx port is busy)

xdebug.remote_host:远程调试的主机地址,不要用什么ip,用docker for mac提供的主机参数”docker.for.mac.localhost”即可。

xdebug.remote_handler:远程连接的方式,这里使用dbgp与PhpStrom保持一致

Xdebug.idekey:用于做连接校验。

xdebug.remote_log:用于存放log的位置,因为我docker下/var/www/html/是映射到mac的,方便我查看日志。

第二步:PhpStorm的配置

第一处:填xdebug上xdebug.remote_port的值

第二处:填写dbgp连接校验相关信息

第三处:添加一个server,用于debug

需要说一下的是那个映射,之前有提到,实际上是根据文件与路径进行匹配的,所以,一定要对。看不懂的,先看下我的docker-compose.yml,就知道我为什么要写/var/www/html了。同时还可以根据不同文件匹配不同的路径。

第四处:添加一个run configuration,ide都是这个套路

设置完成保存,点击工具栏的小电话,将图标状态变成这样:

然后打上断点,访问相应url即可。

结果

熟悉的界面:

疑难杂症

9005 is busy端口占用

之前我有说,理解反了调试机制,使用docker进行了端口暴露,我以为是ide需要访问docker的端口,这样导致了docker占用了9005,ide无法使用9005。如果你不是,建议检查其他应用是否占用了该端口。这张图值得反复查看:

docker xdebug无法配置成功

主要还是so的位置,此外就是xdebug是否已启动,推荐用autostart,不然还是网上查查php怎么启动模块。一般是说重启Apache,但是容器这东西,重启Apache和重启容器没什么区别。

此外就是一些字符,不要用中文字符。

phpStorm连接不成功

主要是检测ide的设置中的端口是否正确,以及访问的host与端口是否正确,其他没啥了。

phpStorm连接成功但是无法debug

检测文件映射配置是否正确,mapping需要匹配得到才行。

以上,祝你调试愉快,而我,感觉要放弃使用php了。

参考:

https://www.jetbrains.com/help/phpstorm/configuring-xdebug.html

https://xdebug.org/docs/install

https://www.jianshu.com/p/b04c4e2c3845

https://www.fanhaobai.com/2017/09/xdebug-in-docker.html


0条评论

发表评论