PHP安装xdebug扩展远程调试代码

准备工作

在IDEA所在机器关闭windows防火墙(或添加端口白名单)

一,安装xdebug扩展

使用pecl或编译xdebug源码安装, 这里直接使用pecl快速安装:

pecl install xdebug

 二,配置xdebug

在php.ini中添加如下配置

xdebug.auto_trace = on
xdebug.overload_var_dump=0
xdebug.trace_output_dir = "/tmp"
xdebug.profiler_output_dir ="/tmp"
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_mode = "req"
xdebug.remote_port=9000
xdebug.remote_autostart=1
xdebug.remote_connect_back=1 #推荐,将尝试连接到发出HTTP请求的客户端,和下面配置选其一
;xdebug.remote_host=10.0.14.251 #远程调试时此处填写IDE所在客户机ip地址
;xdebug.remote_log="/work/log/debug.log"

xdebug的工作流程为当客户端开始debug时,浏览器会携带一个XDEBUG_SESSION_START 参数传递debug会话key,当php捕获到这个key时会根据配置的remote_port端口与目标机器建立一个会话链接(也就是在IDEA所在机器,所以这个端口是IDEA所在机器自身的端口,而不是在服务器上开启的端口),此端口由IDEA编辑器开启和监听

IDEA上的电话监听按钮并不是必须的, 只是代表是否主动监听调试,所以在点击监听后即使访问没有携带debug key断点也会生效,所有请求都将被调试

最后两项配置分别为允许任何机器链接调试remote_connect_back和只允许指定ip的机器调试remote_host

三,配置IDEA开发工具

配置编辑器,设置端口为对应的端口

QQ截图20160408153511

点击菜单栏Run->Edit Configurations

然后添加一个PHP Web Page配置,在老版本中为PHP Web Application,此处注意,默认有一个Templates或Defaults配置,这个只是作为添加模板使用, 所以修改是无效的,点击左上角的”+”就行了

然后在Server那里点击”…” 添加一个Server,此处注意要勾选(本地调试也需要设置同步目录)”Use path mappings(select if the servers is remote or symlinks are used)”并填写服务端对应的远程目录

QQ截图20160408153805

点击Run->Debug”xxx”即可使用携带debug key的方式进行调试

注意

如果IDEA所在机器是内网ip将无法调试,因为远程服务器无法主动和内网机器建立连接,  解决办法有两个

  1. 在内网机器的出口路由上做一个端口映射
  2. 或采用建立隧道的方式,具体参考连接,使用隧道的方式注意需要配置xdebug.remote_host=127.0.0.1

问题与解决流程

xdebug经常会遇到明明按流程来配置了但是却始终无法生效的情况,此时就需要通过配置xdebug日志来排查,推荐排查流程为

  1. 检查两边配置的端口是否一致,并确定端口是否被占用(此端口是IDEA所在客户端的端口)
  2. 开启xdebug日志xdebug.remote_log="/work/log/debug.log"创建此文件并给读写权限
  3. 再通过携带debug key的方式请求调试地址,此时会产生对应的日志内容,分析日志内容并查找解决办法,解决问题后注释此文件避免产生大量日志内容,比如我自己遇到的一个错误:
Log opened at 2018-10-11 06:11:43
I: Checking remote connect back address.
I: Checking header 'HTTP_X_FORWARDED_FOR'.
I: Checking header 'REMOTE_ADDR'.
I: Remote address found, connecting to 192.168.10.138:9000.
W: Creating socket for '192.168.10.138:9000', poll success, but error: Operation now in progress (29).
E: Could not connect to client. :-(
Log closed at 2018-10-11 06:11:43

是由于windows默认开启了防火墙导致

常用快捷键使用说明

  1. (F5)step into就是单步执行,遇到子函数就进入并且继续单步执行;
  2. (F6)step over是在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步。
  3. (F7)step return就是单步执行到子函数内时,用step return就可以执行完子函数余下部分,并返回到上一层函 数。