关于xdebug:新版xdebug3phpStromp远程调试

当初网络上的配置,都写的太简单,我写个简略的: 注:我用的近程模式,phpStorm和代码在本机,nginx+php-strom在vmware里。php.ini:zend_extension=xdebug.soxdebug.log=/tmp/xdebug.logxdebug.mode=debug,developxdebug.discover_client_host=1 ;xdebug3反对主动,不须要填写ip和port了注:如果用了opcache,xdebug.so须要在opcache之后注2:xdebug跟apc不兼容(不过apc当初很少有人用了吧)phpStrom:配置server信息:   端口: (不能是9000,9000已被php-fpm占用)   留神:   插件:装置浏览器插件,并启动: https://chrome.google.com/web...phpstrom上启动listen设置断点后,浏览器间接拜访网址即可开始

November 29, 2022 · 1 min · jiezi

关于xdebug:Macos环境下在vscode编辑器使用xdebug调试php代码

装置xdebugmacos环境下,默认你曾经装置了php和pecl,pecl是php下装置php扩大的一种工具,这里我应用的php7.3 执行以下命令装置xdebug扩大:pecl install xdebug装置实现后执行:php -v而后你会看到相似以下返回信息: PHP 7.3.20 (cli) (built: Jun 4 2021 03:32:07) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Xdebug v3.0.4, Copyright (c) 2002-2021, by Derick Rethans with Zend OPcache v7.3.20, Copyright (c), by Zend Technologies看到xdebug阐明装置胜利了,装置胜利门路相似是:/usr/local/lib/php/pecl/20180731/xdebug.so 更新php.ini文件,门路相似:/usr/local/etc/php/7.3/php.ini复制如下内容到文件开端,这里我应用的是9003端口,如果你应用其余端口,记得批改,否则可能无奈监听到变动: ; Make sure this is the only line which assign `zend_extension` to `xdebug.so`zend_extension = /usr/local/lib/php/pecl/20190902/xdebug.so[xdebug]xdebug.start_with_request=yesxdebug.mode=debugxdebug.client_host = 127.0.0.1xdebug.client_port = 9003xdebug.show_exception_trace = Onxdebug.remote_handler = dbgpVSCode设置装置php debug扩大设置php debug配置文件,这里端口要和php.ini里的端口统一开始调试,记得这里要去网页端申请localhost:9003能力执行

July 3, 2022 · 1 min · jiezi

关于xdebug:使用xdebug调试php详细教程

下载xdebug扩大将phpinfo()中的信息全副复制到Xdebug中的文本框中,如下图所示:点击“Analyse my phpinfo() output”按钮。 跳转到如下图所示页面,会对本机中的php进行剖析,点击“Download php_xdebug-2.7.2-7.2-vc15-x86_64.dll”按钮下载Xdebug扩大。 配置Xdebug扩大将下载好的Xdebug扩大复制到php目录下的ext文件夹中,并在php.ini配置的开端增加如下配置信息: zend_extension=E:\php7\ext\php_xdebug-2.7.2-7.2-vc15-x86_64.dllxdebug.profiler_output_dir="E:\php\xdebug"xdebug.trace_output_dir="E:\php\xdebug"xdebug.remote_port=9000xdebug.idekey=PHPSTORMxdebug.remote_autostart=1xdebug.remote_host=localhostxdebug.remote_enable=1而后重启服务,再次关上phpinfo(),呈现xdebug扩大示意配置胜利 phpStorm中配置Xdebug在罕用的编辑器中配置xdebug,以phpstorm为例,关上“File->Settings->Languages & Development->PHP->Debug”,配置XDebug监听端口号,须要与在php.ini配置文件中配置的端口号保持一致,如下图所示: 关上“File->Settings->Languages & Development->PHP->Debug->DBGp Proxy”,配置DBGp协定配置信息,如下图所示: 关上“File->Settings->Languages & Development->PHP->Server”,配置php运行服务器,如下图所示: 关上“Run/Debug Configurations”,增加“PHP Web Page”,如下图所示: Chrome增加Xdebug helper扩大Chrome增加完Xdebug helper扩大后,须要配置"IDE key",须要与php.ini配置文件中配置的保持一致。下面配置文件写的是PHPSTORM 开启phpStorm调试首先设置运行服务器为localhost,而后关上php debug监听,运行debug模式,最初设置断点,如下图所示: 最初如果你感觉这篇文章对你有点用的话,麻烦请给咱们的开源我的项目点点star:http://github.crmeb.net/u/defu不胜感激 ! 收费获取源码地址:http://www.crmeb.com PHP学习手册:https://doc.crmeb.com 技术交换论坛:https://q.crmeb.com

April 28, 2022 · 1 min · jiezi

Xdebug-远程调试你会用吗

前言在开发过程中,我们最少不了的就是调试,因为 php 不能像 Java 和 C# 那样与生俱来的优势,拥有开箱即用的断点调试,很多时候我们的开发者都是使用的 var_dump 方法来对结果进行输出,而有的时候需要查看调用栈时,有的开发者甚至都不知道如和下手。(可以 throw 异常 或者 使用 debug_print_backtrace 和 debug_backtrace 来打印调用栈),虽然很多开发者知道xdebug 但是也会因为其繁琐的安装望而却步,又或许你在本地高高兴兴搭建好了,有时候要调试一下外网的,比如测试服务器,你会发现这是个坑,很多文章都没有正确的引导你去如何的安装它。 服务器如何安装 Xdebug环境准备ubuntu 16.04php 7+XShell首先打开 Xdebug 官网。 是不是看到硕大的 Download 链接吸引到了你,如果你知道你的 php 是什么版本 你可以在这里愉快的下载,然后并安装。 偶,我凑,怎么全是 Windows 的,Linux 的呢?Linux 当然是要从源码构建啦。 我凑,不会?没关系咱们一起来学一学,首先新建一个 php 文件,如果你是用包管理器安装的那么请直接跳转到包管理器 // info.php<?phpphpinfo();然后放到你的 web 目录,看清楚,一定是 web 目录。不要觉得你耍小聪明,使用 php -S 来启动一个临时的 web 服务器,不允许,因为你这样用到的 php.ini 是 cli 的,而不是 fpm 的,当 phpinfo 信息显示出来。 然后我们回到官网,点击下载页面的 custom installation instructions. ...

July 16, 2019 · 3 min · jiezi

解决安装Xdebug后访问本地项目特别慢

配置[Xdebug]zend_extension = "E:\SoftWare\php\php-73\ext\php_xdebug-2.7.2-7.3-vc15-nts-x86_64.dll"xdebug.remote_enable = 1xdebug.remote_host = "127.0.0.1"xdebug.remote_port = 9009xdebug.remote_autostart = 1xdebug.remote_handler = "dbgp"xdebug.idekey = PHPSTORMxdebug.profiler_enable = 0xdebug.profiler_enable_trigger = 1xdebug.default_enable = "Off"xdebug.remote_mode = req参考链接参考链接 说明设置xdebug.remote_enable = 0或者xdebug.remote_autostart = 0,关掉这两项中的任意一项,就不会出现很慢的情况,但是关掉后就不能监听断点就行调试了;xdebug.remote_host改成127.0.0.1,而不是localhost,phpstorm中的设置也是;xdebug.remote_port只要是一个可用的端口并和phpstorm中的配置一样就行;剩下的配置的,按照配置就行了。博客

May 10, 2019 · 1 min · jiezi

PhpStorm配置Xdebug最完整最详解教程100成功

很多人好奇网上关于php配置xdebug的教程那么多,为什么我还要写这篇文章?因为我看了一下网上的教程配置很乱,有些配置项根本不需要,而且不够详细。 本教程主要应用于Windows,Mac和Linux基本上同理。 只配置Debug,不配置profiler和trace。因为大多数情况下是单用户调试,所以不需要配置多用户参数,如:php.ini 文件 xdebug.idekey 参数和 PhpStorm的Debug -> DBGp Proxy 。 所以大概配置如下: zend_extension = php_xdebug.dllxdebug.remote_enable = Onxdebug.remote_host = 127.0.0.1xdebug.remote_port = 9100xdebug官网下载地址:https://xdebug.org/download.php 扩展一定要装对,注意区分ts和nts版本。推荐 phpEnv集成环境 ,自带xdebug扩展 打开PhpStorm,File -> Settings 然后找到 Languages & Frameworks -> PHP -> Debug设置Debug port为9100为什么不是9000?因为会和一些集成环境的php-cgi或者php-fpm端口冲突. 然后配置Languages & Frameworks -> PHP -> Servers 然后找到PhpStorm右上角电话图标,开始监听php debug的链接 打开 phpEnv集成环境 的 TCP端口进程列表,有9100 说明监听成功 触发PhpStorm的debug方式主要有两种 GET、POST存在XDEBUG_SESSION_START 参数或者cookie里存在XDEBUG_SESSION,用户调试值随意。GET、POST会生成cookie XDEBUG_SESSION,有效期为1个小时(可修改配置)。很多教程需要下载chrome等浏览器插件,原理就是请求里附加cookie。php.ini 文件 xdebug.remote_autostart 参数设置为 On 或者1,无需设置GET、POST、cookie。个人推荐第1种,教大家用一种更简单的方式,不需要下载浏览器插件。找到PhpStorm右上角然后点小甲虫图标会在你配置的url里,携带GET参数XDEBUG_SESSION_START,同时生成cookie XDEBUG_SESSION,也就是说,下次(cookie有效期1小时)无需点击小甲虫,浏览器直接输入,如 www.a.com 或 www.a.com/chat/1/ 即可触发调试 ...

April 23, 2019 · 1 min · jiezi

一文掌握PHP Xdebug 本地与远程调试

原文链接:一文掌握PHP Xdebug 本地与远程调试很久没写PHP了、同样很很久没有用XDebug了,近期有个简单的场景要用到,简单记录一下关键步骤。本地调试本地环境:$ php -vPHP 7.3.4 (cli) (built: Apr 8 2019 10:21:33) ( NTS )Copyright (c) 1997-2018 The PHP GroupZend Engine v3.3.4, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.3.4, Copyright (c) 1999-2018, by Zend Technologies with Xdebug v2.7.1, Copyright (c) 2002-2019, by Derick Rethans环境搭建// 安装xdebug$ pecl install xdebug// 配置xdebug$ vim /usr/local/etc/php/7.3/conf.d/ext-xdebug.ini[xdebug] zend_extension=“xdebug.so” xdebug.remote_enable=On xdebug.remote_port=9001 xdebug.idekey=PHPSTORM xdebug.remote_connect_back = 1// 重启php服务$ brew services restart php@7.3IDE 配置我是在~/Downloads/xdebug/ 目录下放了一个简单的PHP文件test.php来测试,在这个目录下用php -S 127.0.0.1:7790起了个http服务,可参考进行下述配置。 IDEA的几个配置项开启监听效果演示设置之后, 在IDE里打上断点, 在浏览器打开这个链接即可开启测试http://127.0.0.1:7790/test.php?XDEBUG_SESSION_START=PHPSTORM效果如下: 浏览器没有必要安装 Xdebug Helper 插件。远程调试与上一篇联动, 本篇是远程调试, 主要记录一下过程 本地环境:# php -vPHP 7.2.16 (cli) (built: Mar 10 2019 21:22:49) ( NTS )Copyright (c) 1997-2018 The PHP GroupZend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies with Xdebug v2.8.0-dev, Copyright (c) 2002-2019, by Derick Rethans环境搭建// 如果没有安装过需要先行安装# yum install -y php-devel gcc// 安装xdebug# cd /usr/local/src# git clone https://github.com/xdebug/xdebug.git# cd xdebug# ./rebuild.sh// xdebug配置文件# vim /etc/php.d/xdebug.inizend_extension=xdebug.soxdebug.remote_enable=Onxdebug.remote_port=11955xdebug.idekey=PHPSTORM// 重启PHP服务# systemctl restart php-fpm# systemctl status php-fpm然后重点来了,一定不要忘记开放上面配置的xdebug.remote_port端口号,开放此端口号、开放此端口号、开放此端口号。 开放端口每个系统都不太一样,在CentOS7中可以使用firewall-cmd来操作# firewall-cmd –zone=public –add-port=11955/tcp –permanent# firewall-cmd –reloadIDE 配置IDE的配置与本地调试不太一样,总的来说有两种方式,一种是通过在IDE配置Remote Debug, 需要配置登录远端服务器;一种是通过ssh来做远程端口转发到本地来实现类似本地调试的方式。 在这里,我选用了后一种方式来操作。远程端口转发// HOST 为远程服务器在~/.ssh/config的配置host名, 可以替换为你的 比如 root@1.1.1.1ssh -NT -R 11955:127.0.0.1:9001 HOST这样就实现了远程xdebug端口11955到本地9001的映射。IDE配置与本地调试的配置不一样的地方就是host和port,其他地方大同小异。 IDEA-PHP-Servers的配置: host 为远程web服务的域名, port 为远程web提供服务的端口号。 同时需要注意的是:需要勾选 path mappings, 并正确配置要debug的工程目录在远程和本地两个环境的映射关系。 IDEA-PHP-XDebug-DBGp-Proxy的配置: 更改host和port为远程web服务配置,与上一步相同 效果演示设置之后, 在IDE里打上断点, 在浏览器打开这个链接即可开启测试http://example.com/test.php?X…效果如下:同样的,浏览器没有必要安装 Xdebug Helper 插件。 ...

April 20, 2019 · 1 min · jiezi

phpstudy & phpstorm 安装 xdebug

查看phpstudy 位数,和是否 NTS,TS 2. 去下载对应的xdebug .dll 文件3. 打开php.ini 配置,路径改成自己!![XDebug]xdebug.remote_enable=1 # 开启远程调试xdebug.idekey=‘PHPSTORM’ # sessionkeyxdebug.remote_port=9001 # 远程调试通信端口xdebug.profiler_output_dir=“C:phpStudyPHPTutorialtmpxdebug"xdebug.trace_output_dir=“C:phpStudyPHPTutorialtmpxdebug"zend_extension=“C:phpStudyPHPTutorialphpphp-7.1.13-ntsextphp_xdebug-2.7.0-7.1-vc14-nts.dll"4. phpstorm 配置 xdebug,打开设置搜索xdebug 更改端口改成9001避免fast-cgi 端口冲突 5. chrome 下 xdebug helper 扩展,然后选择他再开启他变成绿色6. 最后去开启phpstorm里面的监听(小电话)end 访问网址即可调出调试选择!!

April 1, 2019 · 1 min · jiezi

phpstorm 配置xdebug

最近买了个新本,重新配置下phpstorm xdebug,方便调试提高调试效率是写程序的第一步 —鲁迅自2018年3月份之后,brew 安装php的方式发生改变,现在是brew install php@7.2 可以指定版本了,安装扩展的方式也完全不能用了,所以下载源码编译了下载xdebug官网: https://xdebug.org/download.php下载最稳定的版本 [版本2.6.1][1]编译源码phpize./configure –with-php-config=/usr/local/Cellar/php@7.2/7.2.16/bin/php-configmake && make install Installing shared extensions: /usr/local/Cellar/php@7.2/7.2.16/pecl/20170718/编译到了这个目录,实际软连到了/usr/local/lib/php/pecl 配置xdebug在/usr/local/etc/php/7.2/conf.d 新建ext-xdebug.ini 写入[xdebug]zend_extension="/usr/local/lib/php/pecl/20170718/xdebug.so"xdebug.remote_enable=Onxdebug.remote_connect_back=1xdebug.remote_port=6677xdebug.remote_log=/usr/local/var/log/xdebug.logxdebug.idekey=PHPSTORMxdebug.idekey = mykey ide key, 用于标识调试会话xdebug.remote_autostart 是否自动启动,1:自动, 0: 需要设置 http 请求参数或 cookie 指定,默认 0, 根据需求设置这个值。个人建议设置为 1, 这样不需要在每个需要调试的接口都修改请求参数xdebug.remote_enable = on 是否开启远程调试xdebug.remote_host = 172.16.10.103 远程主机 IP, 也就是 PHPStorm 所在机器(PHPStorm 作为 xdebug client),没有固定 IP 的机器建议使用 connect_back 选项。xdebug.remote_connect_back = on 是否连接回请求发出的主机,如果 PHPStorm 所在的机器 IP 经常变动(DHCP 环境下),则建议开启这个选项xdebug.remote_port = 10000 远程主机端口,也就是开发者机器端口xdebug.idekey=PHPSTROM 和phpstorm 通信的标识重启php,查看是否安装成功/usr/local/etc/php/7.2/conf.d php -m | grep xdebug搞定!!开始配置phpstorm 设置端口设置servers配置debug config访问url?XDEBUG_SESSION_START=PHPSTORM,搞定哈哈哈,配色有点浮夸,还没调 ...

March 31, 2019 · 1 min · jiezi

docker提供api访问

docker提供api访问 环境centosvim /etc/docker/daemon.json添加如下配置{ “hosts”: [ “tcp://0.0.0.0:2375”, “unix:///var/run/docker.sock” ]}添加deamon.json后dockerd命令可以启动docker这时请求 127.0.0.1:2375 可以正常访问使用systemctl无法启动docker的情况systemctl restart dockersystemctl start docker 无法启动docker查看当前的docker配置systemctl cat docker | grep ExecExecStart=/usr/bin/dockerd -H fd://ExecReload=/bin/kill -s HUP $MAINPID覆盖配置systemctl edit docker添加[Service]ExecStart=ExecStart=/usr/bin/dockerd再次查看配置systemctl cat docker | grep ExecExecStart=/usr/bin/dockerd -H fd://ExecReload=/bin/kill -s HUP $MAINPIDExecStart=ExecStart=/usr/bin/dockerd可以使用systemctl命令启动docker参考地址: https://github.com/docker/for…

March 29, 2019 · 1 min · jiezi

使用phpstorm一步步配置Xdebug

使用PHPSTORM以及xdebug有些时间了,但每次一切换环境,貌似xdebug都会来点小问题。于是,准备花时间系统的将配置及排查的过程写一下,以便下次使用的时候,能够不再重复走过去的路。安装xdebug扩展略过。工作原理再借用动图一张:感谢原作者的辛苦付出, 点击查看原文有了上面的原理,在配置的时候,我们就有了方向。步骤如下:配置php.inixdebug安装后,需要配置相应的php.ini文件# 开启远程调试xdebug.remote_enable=1# 定义日志位置,很重要。当发生一些与我们的预期不一致的事件时,我们可以找到这个文件查看。xdebug.remote_log=/var/log/xdebug.log# 远程调试服务器(我们开发的装有PHPSTORM机器)的端口,默认就是这个端口,所以如果你就是用的9000,此项可忽略。xdebug.remote_port=9000# 远程调试服务器(我们开发的装有PHPSTORM机器)的地址,如果XDEBUG和PHPSTORM都是一台机器上,那么这个地址写127.0.0.1即可.xdebug.remote_host=127.0.0.1# 定义IDE KEY。定义后,可以忽略。xdebug.idekey=PHPSTORM注意:查看日志很重要,所以xdebug.remote_log此项配置很重要。测试创建test.php并输入<?php phpinfo();,访问该文件,查看debug信息。同时,还可以看到一些配置信息:配置PHPSTORM配置XDEBUG打开配置界面 -> Languages & Frameworks -> PHP -> Debug此项默认开启,故可忽略点击确定后,按系统不同,可以查看本机9000端口是否开放。panjiedeMac-Pro:~ panjie$ lsof -i:9000COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEPHPSTORM 98883 panjie 293u IPv4 0x9dffc3bec4b8f68b 0t0 TCP *:cslistener (LISTEN)端口直接的启动后,我们便设置好的调试服务器 127.0.0.1和端口9000了。这时候,我们的XDebug便可以找到我们配置CLI打开配置界面 -> Languages & Frameworks -> PHP点击 + , 并选择自己的PHP环境。安装浏览器扩展chrome安装xdebug helper,firefox也类似。作用主要是向cooikes写一个XDEBUG_SESSION=PHPSTORM。安装后,设置一下,否则默认的是eclipse。启用xdebug helper点击enable后,刷新页面。此时:浏览器将带有XDEBUG_SESSION=PHPSTORM发送给PHPPHP将控制权给了xdebugxdebug获取到XDEBUG_SESSION时,与自己的设定时进行比较,相同,则向127.0.0.1:9000发送信息,并中断执行PHPSTORM接收到信息,将信息显示到控制台,并对应的在对应的文件上显示断点,同时发出中断执行指令PHPSTORM发出继续执行指令进行下一步debug.

February 27, 2019 · 1 min · jiezi

PhpStorm配置Xdebug调试

安装xdebug去官网下载对应版本的xdebug扩展 XDEBUG EXTENSION FOR PHP | DOWNLOADS 如何选择正确版本输出phpinfo()函数的内容查看输出页面的网页源码全选复制到这个页面 XDEBUG EXTENSION FOR PHP | DOCUMENTATION | INSTALLATION ,将刚才复制的内容拷贝进去,并分析可以得到自己当前版本的php对应哪一个xdebug文件安装扩展这个windows系统和Linux系统是不一样的(网上很多,不细说)windows放到php ext的目录下配置php.ini [XDebug] zend_extension = “D:\你php的ext目录位置\php\ext\php_xdebug.dll” xdebug.remote_autostart=1 xdebug.remote_enable = On xdebug.remote_handler = “dbgp” xdebug.remote_host = “localhost” #本地服务器 xdebug.remote_port = 9010 #默认为9000,防止与php-fpm冲突,改为9010 xdebug.idekey=“PHPSTORM” #会话需要的key Linux这个很多种情况,一般就apt和yum,如果手动编译就需要.so扩展配置phpStorm先查看xdebug是否安装成功接下去配置phpstorm我是基于这个版本的打开phpstorm配置文件设置本地的php解释器,即php的二进制文件,windows下的php安装路径下的php.exe,类unix系统就是bin/php文件如果没有上述选项填写服务器端的相关信息Host指的是服务器对应的项目的访问域名本地nginx我用127.0.0.1用默认的80端口配置xdebug选项配置DBGp Proxy添加一个调试配置配置chrome安装浏览器插件使用的是Chrome浏览器,安装 xdebug helper插件,无法使用应用商店的可以到国内镜像网站去下配置插件开始调试

February 2, 2019 · 1 min · jiezi

在Docker中使用Xdebug

首发于 樊浩柏科学院我们经常会使用 PhpStorm 结合 Xdebug 进行代码断点调试,这样能追踪程序执行流程,方便调试代码和发现潜在问题。博主将开发环境迁入 Docker 后,Xdebug 调试遇到了些问题,在这里整理出 Docker 中使用 Xdebug 的方法和注意事项。说明:开发和调试环境为本地 Docker 中的 LNMP,IDE 环境为本地 Win10 下的 PhpStorm。这种情况下 Xdebug 属于远程调试模式,IDE 和本地 IP 为 192.168.1.101,Docker 中 LNMP 容器 IP 为 172.17.0.2。问题描述在 Docker 中安装并配置完 Xdebug ,并设置 PhpStorm 中对应的 Debug 参数后,但是 Debug 并不能正常工作。此时,php.ini中 Xdebug 配置如下:xdebug.idekey = phpstormxdebug.remote_enable = onxdebug.remote_connect_back = onxdebug.remote_port = 9001 //PhpStorm监听本地9001端口xdebug.remote_handler = dbgpxdebug.remote_log = /home/tmp/xdebug.log开始收集问题详细表述。首先,观察到 PhpStorm 的 Debug 控制台出现状态:Waiting for incoming connection with ide key ***然后查看 Xdebug 调试日志xdebug.log,存在如下错误:I: Checking remote connect back address.I: Checking header ‘HTTP_X_FORWARDED_FOR’.I: Checking header ‘REMOTE_ADDR’.I: Remote address found, connecting to 172.17.0.1:9001.W: Creating socket for ‘172.17.0.1:9001’, poll success, but error: Operation now in progress (29).E: Could not connect to client. :-(分析问题查看这些问题表述,基本上可以定位为 Xdebug 和 PhpStorm 之间的 网络通信 问题,接下来一步步定位具体问题。排查本地9001端口Win 下执行 netstat -ant命令:协议 本地地址 外部地址 状态 卸载状态TCP 0.0.0.0:9001 0.0.0.0:0 LISTENING InHost端口 9001 监听正常,然后在容器中使用 telnet 尝试同本地 9001 端口建立 TCP 连接:$ telnet 192.168.1.101 9001Trying 192.168.1.101…Connected to 192.168.1.101.Escape character is ‘^]’.说明容器同本地 9001 建立 TCP 连接正常,但是 Xdebug 为什么会报连接失败呢?此时,至少可以排除不会是因为 PhpStorm 端配置的问题。排查Xdebug问题回过头来看看 Xdebug 的错误日志,注意观察到失败时的连接信息:I: Remote address found, connecting to 172.17.0.1:9001.W: Creating socket for ‘172.17.0.1:9001’, poll success, but error: Operation now in progress (29).E: Could not connect to client. :-(此时,在容器中使用 tcpdump 截获的数据包如下:$ tcpdump -nnA port 9001# 尝试建立连接,但是失败了12:20:34.318080 IP 172.17.0.2.40720 > 172.17.0.1.9001: Flags [S], seq 2365657644, win 29200, options [mss 1460,sackOK,TS val 833443 ecr 0,nop,wscale 7], length 0E..<..@.@.=………..#)…,……r.XT…………………12:20:34.318123 IP 172.17.0.1.9001 > 172.17.0.2.40720: Flags [R.], seq 0, ack 2365657645, win 0, length 0E..(.]@.@..M……..#)………-P….B..可以确定的是, Xdebug 是向 IP 为 172.17.0.1 且端口为 9001 的目标机器尝试建立 TCP 连接,而非正确的 192.168.1.101 本地 IP。到底发生了什么?首先,为了搞懂 Xdebug 和 PhpStorm 的交互过程,查了 官方手册 得知,Xdebug 工作在远程调试模式时,有两种工作方式:1、IDE 所在机器 IP 确定/单人开发图中,由于 IDE 的 IP 和监听端口都已知,所以 Xdebug 端可以很明确知道 DBGP 交互时 IDE 目标机器信息,所以 Xdebug 只需配置 xdebug.remote_host、xdebug.remote_port 即可。2、IDE 所在机器 IP 未知/团队开发由于 IDE 的 IP 未知或者 IDE 存在多个 ,那么 Xdebug 无法提前预知 DBGP 交互时的目标 IP,所以不能直接配置 xdebug.remote_host 项(remote_port 项可以确定),必须设置 xdebug.remote_connect_back 为 On 标识(会忽略 xdebug.remote_host 项)。这时,Xdebug 会优先获取 HTTP_X_FORWARDED_FOR 和 REMOTE_ADDR 中的一个值作为通信时 IDE 端的目标 IP,通过Xdebug.log记录可以确认。I: Checking remote connect back address.I: Checking header ‘HTTP_X_FORWARDED_FOR’.I: Checking header ‘REMOTE_ADDR’.I: Remote address found接下来,可以知道 Xdebug 端是工作在远程调试的模式 2 上,Xdebug 会通过 HTTP_X_FORWARDED_FOR 和 REMOTE_ADDR 项获取目标机 IP。Docker 启动容器时已经做了 80 端口映射,忽略宿主机同 Docker 容器复杂的数据包转发规则,先截取容器 80 端口数据包:$ tcpdump -nnA port 80# 请求信息13:30:07.017770 IP 172.17.0.1.33976 > 172.17.0.2.80: Flags [P.], seq 1:208, ack 1, win 229, options [nop,nop,TS val 1250713 ecr 1250713], length 207E….=@.@…………..P.. .+…….Y…………..GET /v2/room/list.json HTTP/1.1Accept: */*Cache-Control: no-cacheHost: localhostConnection: Keep-AliveUser-Agent: Apache-HttpClient/4.5.2 (Java/1.8.0_152-release)Accept-Encoding: gzip,deflate可以看出,数据包的源地址为 172.17.0.1,并非真正的源地址 192.168.1.101,HTTP 请求头中也无 HTTP_X_FORWARDED_FOR 项。说明:172.17.0.1 实际为 Docker 创建的虚拟网桥 docker0 的地址 ,也是所有容器的默认网关。Docker 网络通信方式默认为 Bridge 模式,通信时宿主机会对数据包进行 SNAT 转换,进而源地址变为 docker0,那么,怎么在 Docker 里获取客户端真正 IP 呢?。定位根源最后,可以确定由于 HTTP_X_FORWARDED_FOR 未定义,因此 Xdebug 会取 REMOTE_ADDR 为 IDE 的 IP,同时由于 Docker 特殊的网络转发规则,导致 REMOTE_ADDR 变更为网关 IP,所以 Xdebug 同 PhpStorm 进行 DBGP 交互会失败。解决问题由于 Docker 容器里获取真正客户端 IP 比较复杂,这里使用 Xdebug 的 远程模式 1 明确 IDE 端 IP 来规避源 IP 被修改的情况,最终解决 Xdebug 调试问题。模式 1 的 Xdebug 主要配置为://并没有xdebug.remote_connect_back项xdebug.idekey = phpstormxdebug.remote_enable = onxdebug.remote_host = 192.168.1.101xdebug.remote_port = 9001xdebug.remote_handler = dbgp重启 php-fpm,使用php –ri xdebug确定无误,使用 PhpStorm 重新进行调试。再次在容器中 tcpdump 抓取 9001 端口数据包:# 连接的源地址已经正确14:05:27.379783 IP 172.17.0.2.44668 > 192.168.1.101.9001: Flags [S], seq 3444466556, win 29200, options [mss 1460,sackOK,TS val 1462749 ecr 0,nop,wscale 7], length 0E..<2.@.@……….e.|#).Nc|……r.nO………..Q………再次使用 PhpStorm 的 REST Client 断点调试 API 时, Debug 控制台如下:所以,使用 Xdebug 进行远程调试时,需要选择合适的调试模式,在 Docker 下建议使用远程模式 1。其他注意事项Xdebug 版本和 PHP 版本一致并不是每个 Xdebug 版本都适配 PHP 每个版本,可以直接使用 官方工具,选择合适的 Xdebug 版本。本地文件和远端文件映射关系如上图,在使用 PhpStorm 时进行远程调试时,需要配置本地文件和远端文件的目录映射关系,这样 IDE 才能根据 Xdebug 传递的当前执行文件路径与本地文件做匹配,实现断点调试和单步调试等。 ...

December 22, 2018 · 3 min · jiezi