phpstorm调试远程服务器代码(超详细版本)

phpstorm调试远程服务器代码(超详细版本)

本篇教程是我综合了多篇教程综合而成的产物,每篇教程都会有一些小细节没有写到,折腾了好久终于是整出来了…现在在这里做个记录,也是给后来人避一下坑,先讲一下远程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调试远程服务器代码(超详细版本)

然后开始配置本地,phpstorm全局配置,这里debug port我改成了9001,为了不跟php-fpm的默认端口冲突

phpstorm调试远程服务器代码(超详细版本)

进入项目,看一看是否监听成功,点击右上角的电话符号

phpstorm调试远程服务器代码(超详细版本)

然后在本机的cmd下使用命令:

netstat -ano | findstr "9001"

来查看结果

phpstorm调试远程服务器代码(超详细版本)

然后添加server,进行路径映射和代码同步,别忘了勾选Use path mappings,然后把你想要映射的本地目录和远程目录写好

phpstorm调试远程服务器代码(超详细版本)

接下来,进行代码同步,先进入Configuration

phpstorm调试远程服务器代码(超详细版本)

phpstorm调试远程服务器代码(超详细版本)

把SSH和url配好,这里的url就是你要访问的网站地址,主要用于之后在php remote debug配置的时候做Validate验证,看配置是否成功。我这里已经配好了SSH,如果还没有配好,点击SSH configuration后面的三个点按钮,进入配置页面,把选好Host,username和认证方式,用Test connection检查一下是否配置成功,OK确认

phpstorm调试远程服务器代码(超详细版本)

再进入Mappings做路径映射,在Deployment path里面选择你想映射到本地的文件夹(点右边的文件夹符号可以选,注意只有本地有备份的网站目录才能够被调试)

phpstorm调试远程服务器代码(超详细版本)

别忘了最后点击√,设置为默认服务器(不选中无法进行同步)

phpstorm调试远程服务器代码(超详细版本)

一段时间后配置好了,接下来进行同步,点击Options(这一步可以在全局设置里进行,这样就不用每一次新建一个项目都要配一次了)

phpstorm调试远程服务器代码(超详细版本)

选择ctrl+s保存的选项,这样你在本地做的修改只需要用ctrl+s就可以直接上传

phpstorm调试远程服务器代码(超详细版本)

接下来下载代码,本地有代码备份才能设置断点(给远程服务器返回断点信息,注意本地和远程的代码要同步)

phpstorm调试远程服务器代码(超详细版本)

下载之后,配置SSH隧道,可以用Xshell配置(服务器上端口随便写,本地端口必须与你前面设置的debug port一致),不过需要建立连接,一段时间不操作会断掉

phpstorm调试远程服务器代码(超详细版本)

我个人喜欢用ssh指令手动端口映射,命令:

ssh -F -N -R <your-port>:localhost:<server-port> <username>@<server-ip>

可以指定将本地你指定的端口(debug端口就可以了,我这里是9001)转发到服务器上的某个端口,并且在后台运行(不会占用控制台,接下来可以执行其他命令)

我个人喜欢在前台运行,这样可以很方便地结束端口转发,不用去任务管理器里结束进程,执行命令可以新开一个shell嘛。要实现只需要去掉-F即可:

ssh -N -R <server-port>:localhost:<your-port> <username>@<server-ip>

要验证是否转发成功,只需要在linux上使用

telnet 127.0.0.1 9001

如果连接上即转发成功

phpstorm调试远程服务器代码(超详细版本)

要退出,ctrl+],再输入q回车即可

如果出现:

phpstorm调试远程服务器代码(超详细版本)

到服务器上看看端口占用

lsof -i:9001

然后kill掉对应的进程即可

kill -9 <PID>

(也有可能是你已经连上了当然端口已经占用了…)

回到phpstorm,点击Add Configuration…,在里面添加PHP Remote Debug(PHP Web Page也行,我感觉区别就是点击debug的时候是否会打开一个目标网页),按照如图所示配置:

phpstorm调试远程服务器代码(超详细版本)

注意最后点击一下Validate,看一下自己的配置是否有问题,遇到下面的警告可以不用管,因为IDE检测到服务器是配置的127.0.0.1作为远端端口,它觉得可能请求过不来,但其实你做了端口转发,可以从服务器端口访问到你的本地端口,没有问题。

phpstorm调试远程服务器代码(超详细版本)

接下来,安装这个插件:Xdebug helper – Microsoft Edge Addons,它可以帮你在访问的时候带上一个XDEBUG_SESSION=<IDE-KEY>的cookie,从而触发Xdebug

进入扩展选项,配置IDE key为你在php.ini里配置的IDE key

phpstorm调试远程服务器代码(超详细版本)

最后一步,确认你的IDE正在监听debug端口,本地给你下载下来的文件打断点,然后开启Xdebug Helper,访问目标网址,就可以调试啦~

phpstorm调试远程服务器代码(超详细版本)

其实不只是你指定的目标网址,只要开启了插件,带上了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,欢迎关注~

                       

点击阅读全文

上一篇 2023年 6月 9日 pm9:05
下一篇 2023年 6月 9日 pm9:06