http://xxlegend.com/2017/05/23/PhpStorm%20Xdebug%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90%E5%8F%8A%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5/
1,环境介绍
本地:windows7(192.168..)+ phpstorm8
远程:Ubuntu14.04(192.168.3.206)+ apache2 + php5
2 远程环境配置
2.2 xdebug安装
Ubuntu下直接apt-get安装,安装命令如下:apt-get install php5-xdebug
2.3 配置
首先通过locate定位到xdebug.ini,这个位置一定得对,在Ubuntu上位于/etc/php5/apache2/conf.d/20-xdebug.ini
zend_extension=xdebug.so
xdebug.idekey=PHPSTORM
xdebug.remote_connect_back = 1
;//如果开启此,将忽略下面的 xdebug.remote_host 的参数
;xdebug.remote_host=192.168.x.x
; //注意这里是,客户端的ip<即IDE的机器的ip,不是你的web server>
xdebug.remote_enable=on
xdebug.remote_port = 9001
;//注意这里是,客户端的端口<即IDE的机器的ip,不是你的web server>
xdebug.remote_handler = dbgp
xdebug.auto_trace = 1
xdebug.remote_log = /tmp/xdebug.log
3 本地phpstorm配置
下面的配置有执行顺序要求,请一步一步来。
3.1 下载远程代码
phpstorm在新建项目的时候提供了选项,可以通过ftp/sftp远程下载代码,直接按照提示下一步下一步就可以
3.2 添加php解释器
通过file->settings->Languages & Frameworks找到php栏
3.3 配置Debug
路径还是在file->settings->Languages & Frameworks->PHP,选择Debug,选择要监听的端口,这里设置为9001,如图所示:
设置完端口还需要设置DBGp Proxy,配置如下:
在设置完Debug页面后,在DBGp Proxy页面的端口已经确定,添加上IDE key为刚才xdebug配置文件设置的key:PHPSTORM,Host则为要调试的远程主机。
3.4 配置Server
通过通过file->settings->Languages Frameworks->PHP找到Servers,Host对应远程主机IP,Debugger选用Xdebug,如果是远程调试,一定得开启路径映射功能,否则无法调试,本地的路径不用选,在新建远程项目的时候就已经确定,Absolute path on the server则是远程主机的Web路径。在途中红框上方有一个Validate remote environment可以用来验证远程的Xdebug配置,如果配置明显不对的话,会有提示信息,可按照提示信息修改远程服务器的xdebug配置。
3.5 配置调试选项
由于调试的目标是一个项目,所以这里需要设置PHP Web Application,配置中Server:远程目标主机,Start URL设为/,设置完之后会在左侧新建一个PHP Web Application
到目前为止,该配置的都已经配置完成,这里面配置的选项比较多,一步一步配置,有顺序要求。配置完之后就是调试。点击下图右边红框中的小按钮,打开xdebug监听,再选择我们要调试的目标,这里是server,最后点击那个调试按钮,就能开启调试之旅。
打开xdebug监听的时候,可以看到IDE已经在本地建立监听服务,具体如下:
可以看到调试页面。如下所示
3.6 浏览器添加书签或者Xdebug Helper
前面描述的是通过PHPStorm的debug按钮,发送类似?XDEBUG_SESSION_START=17212这种请求调起浏览器来达到调试的目的,但是这种方式只能调起首页,存在缺陷。下面介绍另外一种启动调试的方式,就是通过浏览器中带XDEBUG_SESSION
的cookie直接发起,可以安装Chrome插件Xdebug Helper或者添加浏览器的调试插件、或书签来达到目的。新建书签的url:https://www.jetbrains.com/phpstorm/marklets/,这里就不再做示例,插件和书签的原理都是一样的,都是在cookie中添加XDEBUG_SESSION=PHPSTORM。
4 数据流程
前面的配置完全是一个操作指南,如果仅仅是为了配置,上面的内容已经足够,但是如果配置中遇到什么问题,就需要接下来的原理分析。古人说的好,我们得知其然还得知其所以然。
4.1 Xdebug工作原理
1,IDE(如PhpStorm)已经集成了一个遵循BGDP的Xdebug插件,当开启它的时候, 会在本地开一个xdebug调试服务,监听在调试器中所设置的端口上,默认是9000,这个服务就会监听所有到9000端口的链接。在PhpStorm中,位于:工具栏 > Run > Start / Stop Listening for PHP Xdebug Connetions。
2,当浏览器发送一个带XDEBUG_SESSION_START的参数的请求到服务器时,服务器接受后将其转到后端的php处理,如果php开启了xdebug模块,则会将debug信息转发到客户端IP的IDE的调试端口上。当参数或者cookie信息中不带XDEBUG_SESSION_START,则不会启动调试。这就为后续在浏览器中添加开关提供了可能。Xdebug的官方给出了一个示例图:很好的展示了相互调用关系。
这个示例图是绑定了ip,即使用了固定ip地址,xdebug.remote_connect_back = 0 ,也是 xdebug 的默认方式,这种情况下,xdebug 在收到调试通知时会读取配置 xdebug.remote_host 和 xdebug.remote_port ,默认是 localhost:9000,然后向这个端口发送通知,这种方式只适合单一客户端开发调试。
另外一种方式则是不绑定IP,Xdebug根据请求来源(REMOTE_HOST)来发起调试。示例图如下:
那从用户发起请求到,到IDE的整个流程图如下:
当用户的请求参数或者cookie中不带调试信息,数据流就是浏览器到Apache(或其他web容器)到PHP,如果加上了调试参数,则请求还会由PHP转给Xdebug处理,Xdebug再把信息转发给IDE,完成调试功能。
使用 xdebug.remote_connect_back=1 配置时,本地IDE收不到debug信息,猜测可能跟docker有关,故改成使用 xdebug.remote_host=172.25.162.76的配置方式。 remote_connect_back=1会自动将debug信息转发到发起请求的机器,可以同时多人进行调试;指定remote_host则会固定转发到指定机器,只能单人使用。 修改配置后重启php-fpm(docker里不同版本的fpm都叫php-fpm)。
Tips:
使用 systemctl restart php-fpm 或者 service php-fpm restart 重启会提示如下错误:
Failed to get D-Bus connection: Operation not permitted
如下原因:systemd维护系统服务程序,它需要特权去会访问Linux内核。而容器并不是一个完整的操作系统,只有一个文件系统,而且默认启动只是普通用户这样的权限访问Linux内核,也就是没有特权。
故采用直接给php-fpm发送信号的方式重启php-fpm
[xiaoju@42c0284fd8b7 ~]$ ps -ef|grep php-fpm | grep php7
xiaoju 1404 1 0 16:16 ? 00:00:00 php-fpm: master process (/home/xiaoju/php7/etc/php-fpm.conf)
[xiaoju@42c0284fd8b7 ~]$ kill -USR2 1404
修改配置超时时间:
nginx:
keepalive_timeout 1h;
#tcp_nodelay on;
fastcgi_connect_timeout 1h;
fastcgi_send_timeout 1h;
fastcgi_read_timeout 1h;
php-fpm:
request_terminate_timeout = 3600
php.ini
max_execution_time = 0
调试其实就是利用CPU中断机制加上INT3指令,使在进程中执行的程序暂停,然后记录当时的内存情况(变量值),然后将记录的数据提交给debugger,再通过符号文件(例如windows下的.pdb文件,pdb文件记录对应程序的变量地址,函数入口地址,程序编译的一些信息,另外还记录了源代码的行数等信息)映射到源代码中,并显示执行时的各种内存值。
VS中的“远程调试”提供了对在远程机器上的程序进行调试的功能。大概就是将msvsmon.exe及该目录下的其他文件拷贝到远程机器上,并配置好调试的方式,并在本地电脑上的VS附近到进程(这里不是很清楚,没有远程机器给我尝试)进行调试。
https://www.cnblogs.com/jice/p/5064838.html
https://xdebug.org/docs/dbgp