PHP的Xdebug常用配置

原创
2019/06/21 17:57
阅读数 558

简单的原理讲解

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记录可以确认。

操作流程,个人理解

  1. 我们在设置完PHPSTORM之后, PHPSTORM会一直监听设置好的9001端口
  2. 这时候我们通过浏览器或者其他方式,请求配置好的host,需要再URL后?XDEBUG_SESSION_START=IDEA_DEBUG(这里可以随便写,如果从phpstorm操作的话, 会随机分配一个)
  3. 这时候,URI参数会被写入到cookie中,下次没有URI传参, 也可以进行xdebug
  4. PHP中的xdebug侦测到要做xdebug(通过Url或cookie)之后会将信息发送给指定的IP或者匹配到的IP(具体看怎么配置,如何配置在下面的我的常用基本配置有详解),

问题收集

xdebug.remote_connect_back = 1 设置,自动获取IP,不生效

xdebug.remote_connect_back = 1
设置,自动获取IP,不生效

这里是因为我的环境都是基于docker 而docker 默认是bridge网桥模式
原理我就不说,在docker栏目中有介绍,总之PHP获取到的总是bridgeIP即我这里172.17.0.1
但是实际上clientIP为192.168.20.76,所以处理不了.
xdebug.log日志也有记录:
Log opened at 2018-07-29 07:39:59
I: Checking remote connect back address.
I: Checking header 'HTTP_X_FORWARDED_FOR'.
I: Remote address found, connecting to :9001.
W: Creating socket for ':9001', getaddrinfo: No such file or directory.
E: Could not connect to client. :-(
Log closed at 2018-07-29 07:39:59

如果非要用的话, 可以在启动容器的时候使用--net=host 使用host模式启动容器

xdebug.remote_host = 127.0.0.1 指定IP地位为127.0.0.1不可用

xdebug.remote_host = 127.0.0.1
指定IP地位为127.0.0.1不可用

这里我始终没有解决办法...

同样我的环境都是放在docker中的
首先我的启动容器的时候已经会用-p 127.0.0.1:9001:9001做了端口映射,
但是这里还是不行, 必须..指定为client IP... 比如我用,host宿主机访问的本地docker中的环境,
xdebug.remote_host = 192.168.20.76
只能这样, 这样就造成一个问题, 就是主机的IP是经常变得,,, 那就要经常改remote_host,很尴尬

常用配置

[Xdebug]

;启用代码自动跟踪
xdebug.auto_trace=on
;允许收集传递给函数的参数变量
xdebug.collect_params=on
;允许收集函数调用的返回值
xdebug.collect_return=on
;指定堆栈跟踪文件的存放目录
xdebug.trace_output_dir="/usr/local/var/log/php/xdebug/trace.log"
;指定性能分析文件的存放目录
xdebug.profiler_output_dir="/usr/local/var/log/php/xdebug/profiler.log"
;指定性能分析信息文件的名称
xdebug.profiler_output_name = cachegrind.out.%t.%p
; 该参数是要加载的 xdebug.so 模块,具体是 ext 可以到
; /usr/local/etc/php/5.4/ext 去查看详情,默认会有扩展的目录
; 该配置配置于:conf.d/ext-xdebug.ini
; zend_extension = ext/xdebug.so
; 是否开启远程调试
xdebug.remote_enable = on
; 远程的 host,默认本地,然后可以配置为 vagrant 的地址
xdebug.remote_host = 127.0.0.1
; 使用非 9000 默认端口,9000 端口我失败了,所以最好改动一下,避免 fuck
xdebug.remote_port = 9010
; 使用 dbgp 做 80 端口代理
xdebug.remote_handler = dbgp
; 这里的 的 key 必须和到时候 IDE 中的一致
xdebug.idekey = PHPSTORM
; 指定远程调试的日志文件名
xdebug.remote_log = "/usr/local/var/log/php/xdebug/default.log"
; 是否开启异常跟踪
xdebug.show_exception_trace=1
;错误情况下产生的堆栈跟踪会显示所有变量信息在最顶端范围,也就是在页面输出的时候会在notice之类错误信息下面带一堆表格...这有可能会产生大量信息,所以默认情况下关闭。
xdebug.show_local_vars = 0
; 启用性能检测分析,开启后, 每次请求都会自动处理
xdebug.profiler_enable=1
; 在PHP应用的任何一个URL中加上XDEBUG_PROFILE=1的请求参数,在单个请求总开启xdebug.
; xdebug检测到该参数会检测当前请求,生成报告.将其保存在xdebug.profiler_output_dir指定的目录中
xdebug.profiler_enable_trigger=1
; 如果配置该项就不需要配xdebug.remote_host
; 如果xdebug.remote_connect_back利用了,其连接方式有些不同:
; 服务器IP和HTTP端口10.0.1.2:80
; IDE所在机器是未知IP,所以 xdebug.remote_connect_back 设为1。
; IDE侦听端口9000,因此 xdebug.remote_port 设为9000
; HTTP请求开始, Xdebug通过HTTP头部获取IP地址。
; Xdebug连接获取到的IP (10.0.1.42)于端口9000
; 调试运行,HTTP提供回应。
; 如果设置生效, xdebug.remote_host 设置会忽略而Xdebug会尝试给制造HTTP请求的客户端进行连接。
; 它会检查$_SERVER['REMOTE_ADDR'] 变量并找出使用的IP地址。
; 请记住它没有有效的过滤,任何人都能启动调试会话连接到服务器,即使他们的地址并不匹配 xdebug.remote_host.
xdebug.remote_connect_back=1

我的常用基本配置

常用的配置方式一般有两种,但是都是基于remote的远程调试方式,这样的好处是,不会疯狂弹浏览器....

  1. 一种是按照绑定指定IP地址
  2. 通过HTTP头部获取IP地址,Xdebug连接获取到的IP,调试运行,HTTP提供回应。
两者的PHP的配置不同,但是PHPstorm中的配置是一样的
1.  Language & Framewworks > PHP > Debug
    中在xdebug一项中配置相应的端口和PHP中的xdebug配置保持一致
2.  Language & Framewworks > PHP > Servers
    注意这里是一个项目配置至少一个,其他项目里看不到,
    配置host为指定的HOST,Port为80, Debugger为xdebug
    选中Use path mapping...选中下面的路径,右边路径为服务器里的绝对路径
    比如: 左边 /Users/www/coinegg 右边/home/www/coinegg
3.  Language & Framewworks > PHP > Debug > Dbgp Proxy
    中配置和PHP中的保持一致, port为80
4.  后面在用的时候在编码窗口上面的小绿虫子旁边的下拉箭头里的,配置Edit Configurations 中
    选中之前配置的server命令,如果没有,就选择后面的... 按照第二步中的那样配置一个,IEDKEY和PHP中的保持一致
  • 自动处理IP并返回
xdebug.idekey = PHPSTORM
xdebug.remote_enable = on
;通过该参数,指定自动获取IP处理
xdebug.remote_connect_back = on
xdebug.remote_port = 9001
xdebug.remote_handler = dbgp
xdebug.remote_log = /usr/local/var/log/php/xdebug/default.log
  • 根据绑定IP
;并没有xdebug.remote_connect_back项
xdebug.idekey = PHPSTORM
xdebug.remote_enable = on
xdebug.remote_host = 192.168.20.76
xdebug.remote_port = 9001
xdebug.remote_log =/usr/local/var/log/php/xdebug/default.log

Xdebug做性能分析

性能分析和debug不冲突,可以同时用也没问题.

xdebug.profiler_enable=1
xdebug.profiler_enable_trigger=1
xdebug.profiler_output_dir=/usr/local/var/log/php/xdebug/profiler.log
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部