PHPStorm+Xdebug2.x调试php代码,命令行cli调试,本地,远程调试
Xdebug原理
1,IDE(PhpStorm)已经集成了一个遵循DBGP的Xdebug插件,当开启它的时候,会在本地开一个xdebug调试服务,监听端口默认是9000,然后就静静等等待安装了Xdebug的PHP服务商连接到它上面给发发信息进行调试。在PhpStorm中,位于:工具栏 > Run > Start / Stop Listening for PHP Xdebug Connetions。
2,浏览器发送一个带XDEBUG_SESSION_START的参数或Cookie到服务器,服务器接受后将其转到后端的php处理,如果php开启了xdebug模块,Xdebug就会连接到配置的IP和端口,将debug信息转发到IDE上。
本地调试
安装谷歌浏览器,并且安装一个 Xdebug helper 扩展插件
安装phpstorm编辑器
php安装xdebug扩展
配置xdebug2.x
3.x配置项有变更,下面是2.x的配置,详情查看 https://xdebug.org/docs/upgrade_guide
首先配置php.ini 开启xdebug模块并写入下面配置
# 如果开启,则会自动启动调试会话,不管请求中有没有设置idekey这个标识 xdebug.remote_autostart = 0 # 开启远程调试 xdebug.remote_enable = 1 xdebug.remote_handler = "dbgp" # 本地调试就用本机ip,如果是远程调试则填写phpstorm所在电脑ip,保证xdebug能连接到phpstorm编辑器 xdebug.remote_host = "127.0.0.1" # 此项开启后会自动连接至请求来源id,但remote_host需留空 xdebug.remote_connect_back=0 xdebug.remote_port=9000 # 启动调试后会把这个值回传给ide # 回传给ide的值 xdebug.idekey="PHPSTORM" ;记录优化信息 xdebug.profiler_enable=0 xdebug.auto_trace=0 xdebug.collect_params=1 xdebug.collect_return=1 xdebug.profiler_append=1 xdebug.profiler_enable_trigger=on ;变量多显示下级数组 xdebug.var_display_max_children=128 xdebug.var_display_max_data=1024 xdebug.var_display_max_depth=15
使用phpinfo查看输出看xdebug有没有安装成功
然后打phpstorm编辑器配置xdebug,打开设置如图:
找到php里面的debug选项找到xdebug的配置项,写入你在php.ini中的的xdebug的端口
配置浏览器
打开谷歌浏览器(确保安装啦xdebug helper插件)设置ide key为 phpstorm。这里跟上面php.ini中的一样就好
火狐浏览器要安装 Cute Xdebug这个插件
打开它的设置为下面如图:
然后在你的谷歌浏览器中打开要调试的项目地址,点击扩展栏中的xdebug helper图标
火狐中要开启如图图标:
最后打开phpstorm run>Start Listen PHP Debug Connections开始等待PHP服务端的Xdebug连接上来,注意端口不要被其它端口占用,特别注意windows下php-cgi默认是9000端口。
浏览器请求时会在你打开的页面url或cookie中添加XDEBUG_SESSION_START,服务端Xdebug遇到这个标记会启动调试会话连接到编辑器。并发送调试信息到编辑器
浏览器调试
启动调试:点击电话小图标。如果没有的话可以直接 菜单 run->start listening for php debug contections
在phpstorm中下断点,然后回到浏览器中操作,第一断运行会弹出个提示框,如下图:
说明已经配置成功 accept 接受就进入编辑器中的一个断点啦如下:
至此可以快乐的调试喽
CLI调试
有时候需要调试命令行程序,这个时候没有办法像上面一样安装浏览器插件来调试,但是我们可以用另一个方法,让xdebug自动启动一远端调试会话并尝试连接到一个调试客户端,只需要使用下面配置就可以啦
xdebug.remote_autostart = 1
开启自动启动调试会话后,只要有请求过来Xdebug都会启动一个会话,这点是大家要注意的
cli下也可以设置命令行环境下的idekey,如下
set XDEBUG_CONFIG=remote_enable=1 idekey=PHPSTORM remote_host=127.0.0.1 remote_port=9000 remote_autostart=0
远程调试
浏览器调试
服务器为vmware中安装的ubuntu,开发在window10系统宿主机
其实也很简单,只要把xdebug的远程主机填写成你win10宿主机ip,另外特别注意一点phpstorm中的server选项里要填写项目的源代码映射位置,不然会出现能断下来,但是因为找不到源代码路径,导致不能单步跟进,
xdebug.profiler_append = 0 xdebug.profiler_enable = 1 xdebug.profiler_enable_trigger = 0 #如果开启,则会自动启动调试会话,不管请求中有没有设置idekey这个标识 xdebug.remote_autostart = 0 xdebug.remote_enable = 1 xdebug.remote_handler = "dbgp" #本地调试就用本机ip,如果是远程调试则填写phpstorm所在电脑ip,保证xdebug能连接到phpstorm编辑器 xdebug.remote_host = "192.168.1.11" xdebug.remote_port=9000 xdebug.idekey="PHPSTORM"
远程调试因为服务器代码路径和本地可能会不一样,会导致phpstorm找不到源代码位置,所以需要在phpstorm调试配置里映射下源代码位置
cli调试
在命令行下需要设置服务器环境变量,让phpstorm知道使用哪个服务器配置来找到源代码的位置,如下:
linux下设置
export XDEBUG_CONFIG="remote_enable=1 idekey=PHPSTORM remote_host=192.168.1.111 remote_port=9000 remote_autostart=1" export PHP_IDE_CONFIG="serverName=myserver.loc"
window下设置
set XDEBUG_CONFIG=remote_enable=1 idekey=PHPSTORM remote_host=192.168.1.111 remote_port=9000 remote_autostart=1 set PHP_IDE_CONFIG="serverName=myserver.loc"
设置PHP_IDE_CONFIG后,phpstorm会根据此设置来找源代码的位置
也可以创建一个 ~/.profile 文件在里面输入以下环境变量,在每次打开命令行时自动设置
export PHP_IDE_CONFIG=serverName=myserver.loc
多客户机远程调试
上面配置后只能一个人进行远程调试,如果需要多个人同时远程调试就需要在服务器上设置dbgp proxy,代理会提供两个端口,让ide和服务端的xdebug都连接到这个代理进行中转,这个时候前面设置的idekey就很有用了,这个key需要在代理那里先注册,然后才能使用,代理软件提供两个如下:
https://code.activestate.com/komodo/remotedebugging/
https://xdebug.org/download#dbgpProxy
注意事项
windows下调试时打上断点,这时候有个curl请求本地的其它项目或本项目时会超时,原因是windows下面php-cgi不支持并发,想解决这个问题得再启动一个php-cgi进程且端口不能跟上一个一样,让curl访问的服务由另一个php-cgi进程处理就可以了,其实还是至标不治本,最好还是在linux下使用
如果开发composer插件时想调试脚本,会发现xdebug不起作用,因为composer为了性能默认是禁用xdebug的,需要加入下面环境变量才可以调试
COMPOSER_ALLOW_XDEBUG=1 COMPOSER_DISABLE_XDEBUG_WARN=1