本篇教程是我综合了多篇教程综合而成的产物,每篇教程都会有一些小细节没有写到,折腾了好久终于是整出来了...现在在这里做个记录,也是给后来人避一下坑,先讲一下远程debug的原理:(本段来自:可能是全网最详细的PhpStorm+xdebug远程调试php代码的教程 | Bruce's Blog (xiebruce.top),有改动)
1、IDE(比如phpstorm)中已经集成了一个遵循DBGp协议的Xdebug插件,当点击IDE上的监听按钮(像电话形状的按钮)时,IDE就会在本地监听指定的端口(端口号可配置);
2、点击IDE上的debug按钮(即小虫子按钮),则会自动在浏览器打开配置好的链接,并自动添加XDEBUG_SESSION_START=xxx这样的一个参数;(以GET,POST或者cookie的形式)
3、由于有XDEBUG_SESSION_START参数,而xdebug是php的扩展,所以xdebug会接收到这个参数并开启debug功能,然后xdebug会通过DBGp协议向xdebug配置中指定的ip和端口(在php.ini中指定该ip该端口)发送一个请求,(这里需要使用SSH隧道进行端口映射,如果想详细了解建议看这一篇文章:SSH端口转发(SSH隧道) | Bruce's Blog (xiebruce.top))而IDE刚好在监听该端口,所以IDE能接收到xdebug的请求,此时xdebug与IDE之间会建立连接(使用DBGp协议通讯),并且IDE会把断点信息发送给xdebug;
4、xdebug收到了断点信息后,就知道运行到哪一行时需要停止并把debug数据返回给IDE,IDE接收到debug数据就会在IDE中显示出来,于是我们就能看到debug数据;
5、当我们点击IDE上的debug按钮(例如step over, step into, step out)时,IDE又会把这个指令发送给xdebug(通过DBGp协议),xdebug接收到后,就知道应该要step over、step into还是step out等等,并且把执行结果返回给IDE,如此往复。
下面开始介绍主要过程:
首先是远程服务器上下载xdebug,教程参见:php多版本分别利用源码安装扩展 - yink's studio (yinkstudio.xyz)
然后在php.ini里面进行配置,把这一段加到php.ini最后
[xdebug] zend_extension=xdebug.so ;扩展so文件路径 xdebug.idekey=PHPSTORM ;自定义的idekey xdebug.discover_client_host = Off ;如果开启此,将忽略下面的 xdebug.remote_host 的参数 xdebug.client_host="127.0.0.1" ;注意这里是,客户端的ip<即IDE的机器的ip,不是你的web server> xdebug.mode=profile,trace,debug ;开启xdebug模式 ;xdebug.start_with_request=yes ;这一行代表开启自动调试,我在这里注释掉了,这样就可以利用xdebug插件自由控制什么时候需要debug ;想要开启取消注释即可 xdebug.client_port = 9001 ;注意这里是,客户端的端口<即IDE的机器的ip,不是你的web server,这是在phpstorm里面自定义的> xdebug.remote_handler = dbgp ;固定填dbgp(因为目前只支持这个协议,也只有这个协议) xdebug.log = /tmp/xdebug.log ;日志路径
添加完成后,重启php,再看phpinfo,里面会多出来xdebug的选项
然后开始配置本地,phpstorm全局配置,这里debug port我改成了9001,为了不跟php-fpm的默认端口冲突
进入项目,看一看是否监听成功,点击右上角的电话符号
然后在本机的cmd下使用命令:
netstat -ano | findstr "9001"
来查看结果
然后添加server,进行路径映射和代码同步,别忘了勾选Use path mappings,然后把你想要映射的本地目录和远程目录写好
接下来,进行代码同步,先进入Configuration
把SSH和url配好,这里的url就是你要访问的网站地址,主要用于之后在php remote debug配置的时候做Validate验证,看配置是否成功。
我这里已经配好了SSH,如果还没有配好,点击SSH configuration后面的三个点按钮,进入配置页面,把选好Host,username和认证方式,用Test connection检查一下是否配置成功,OK确认
再进入Mappings做路径映射,在Deployment path里面选择你想映射到本地的文件夹(点右边的文件夹符号可以选,注意只有本地有备份的网站目录才能够被调试)
别忘了最后点击√,设置为默认服务器(不选中无法进行同步)
一段时间后配置好了,接下来进行同步,点击Options(这一步可以在全局设置里进行,这样就不用每一次新建一个项目都要配一次了)
选择ctrl+s保存的选项,这样你在本地做的修改只需要用ctrl+s就可以直接上传
接下来下载代码,本地有代码备份才能设置断点(给远程服务器返回断点信息,注意本地和远程的代码要同步)
下载之后,配置SSH隧道,可以用Xshell配置(服务器上端口随便写,本地端口必须与你前面设置的debug port一致),不过需要建立连接,一段时间不 *** 作会断掉
我个人喜欢用ssh指令手动端口映射,命令:
ssh -F -N -R:localhost: @
可以指定将本地你指定的端口(debug端口就可以了,我这里是9001)转发到服务器上的某个端口,并且在后台运行(不会占用控制台,接下来可以执行其他命令)
我个人喜欢在前台运行,这样可以很方便地结束端口转发,不用去任务管理器里结束进程,执行命令可以新开一个shell嘛。
要实现只需要去掉-F即可:
ssh -N -R:localhost: @
要验证是否转发成功,只需要在linux上使用
telnet 127.0.0.1 9001
如果连接上即转发成功
要退出,ctrl+],再输入q回车即可
如果出现:
到服务器上看看端口占用
lsof -i:9001
然后kill掉对应的进程即可
kill -9
(也有可能是你已经连上了当然端口已经占用了...)
回到phpstorm,点击Add Configuration...,在里面添加PHP Remote Debug(PHP Web Page也行,我感觉区别就是点击debug的时候是否会打开一个目标网页),按照如图所示配置:
注意最后点击一下Validate,看一下自己的配置是否有问题,遇到下面的警告可以不用管,因为IDE检测到服务器是配置的127.0.0.1作为远端端口,它觉得可能请求过不来,但其实你做了端口转发,可以从服务器端口访问到你的本地端口,没有问题。
接下来,安装这个插件:Xdebug helper - Microsoft Edge Addons,它可以帮你在访问的时候带上一个XDEBUG_SESSION=
进入扩展选项,配置IDE key为你在php.ini里配置的IDE key
最后一步,确认你的IDE正在监听debug端口,本地给你下载下来的文件打断点,然后开启Xdebug Helper,访问目标网址,就可以调试啦~
其实不只是你指定的目标网址,只要开启了插件,带上了cookie,并且访问的url的php版本配置好了Xdebug,在本地的phpstorm都可以看到请求,不过只有你在本地有同步下来的源代码的网页才可以设断点调试~
另外,可能会出现调试中间连接断掉的情况,可以延长连接保持时间,解决方案如下:
Apache:
1.找到这一行并且把前面的注释去掉
Include conf/extra/httpd-default.conf
2.在apache\conf\original\extra\httpd-default.conf里修改(如果有就修改,如果没有就在结尾添加就好)
#xdebug: # Timeout: The number of seconds before receives and sends time out. # Timeout 7200 # # KeepAlive: Whether or not to allow persistent connections (more than # one request per connection). Set to "Off" to deactivate. # KeepAlive On # # MaxKeepAliveRequests: The maximum number of requests to allow # during a persistent connection. Set to 0 to allow an unlimited amount. # We recommend you leave this number high, for maximum performance. # MaxKeepAliveRequests 0 # # KeepAliveTimeout: Number of seconds to wait for the next request from the # same client on the same connection. # KeepAliveTimeout 7200
3.修改 php-fpm.conf 配置
request_terminate_timeout = 0
nginx:
参见这篇文章:[工具] WSL 下优雅地 Debug | PHP 技术论坛 (learnku.com)
主要参考文章:可能是全网最详细的PhpStorm+xdebug远程调试php代码的教程 | Bruce's Blog
我的博客:https://yinkstudio.xyz,欢迎关注~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)