前言:
一个字:坑、真坑。
环境背景
系统: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=i.lckiss.com 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提供的主机参数”i.lckiss.com”即可。
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
本站由以下主机服务商提供服务支持:
0条评论