xdebug

$ pecl install xdebug
WARNING: channel “pecl.php.net” has updated its protocols, use “pecl channel-update pecl.php.net” to update
pecl/xdebug requires PHP (version >= 7.1.0), installed version is 7.0.6
No valid packages found
install failed



$ wget http://xdebug.org/files/xdebug-2.3.3.tgz
–2020-05-20 12:55:04– http://xdebug.org/files/xdebug-2.3.3.tgz
Resolving xdebug.org (xdebug.org)… failed: Temporary failure in name resolution.
wget: unable to resolve host address ‘xdebug.org’



$ git clone https://github.com/xdebug/xdebug.git
Cloning into ‘xdebug’…
remote: Enumerating objects: 19, done.
remote: Counting objects: 100% (19/19), done.



cd xdebug/
phpize
./configure –enable-xdebug
make
checking Check for supported PHP versions… configure: error: not supported. Need a PHP version >= 7.1.0 and < 8.1.0 (found 7.0.6)



查看对应版本
https://github.com/xdebug/xdebug.org/blob/master/src/XdebugVersion.php
‘7.0’ => [ ‘src’ => ‘2.8.1’,



git tag
git checkout 2.8.1
$ git branch



  • (detached from 2.8.1)



phpize
./configure –enable-xdebug
make



Build complete.
Don’t forget to run ‘make test’.



Installing shared extensions: /home/xiaoju/php7/lib/php/extensions/no-debug-non-zts-20151012/



ls /home/xiaoju/php7/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so
/home/xiaoju/php7/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so



vi ~/php7/etc/php.ini +2003
[xdebug]
zend_extension= “/home/xiaoju/php7/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so”
xdebug.default_enable = On
xdebug.show_exception_trace = On
xdebug.show_local_vars = 1
xdebug.max_nesting_level = 50
xdebug.var_display_max_depth = 6
xdebug.dump_once = On
xdebug.dump_globals = On
xdebug.dump_undefined = On
xdebug.dump.REQUEST = *
xdebug.cli_color = 2
xdebug.overload_var_dump=off



xdebug.remote_enable=1
xdebug.remote_host=127.0.0.1
xdebug.remote_port=8098
xdebug.remote_handler=dbgp



$ sh ~/php7/load.sh restart
Shutting down php_fpm . done
Starting php_fpm Cannot load Xdebug - it was already loaded



$ php -m | grep xdebug
Cannot load Xdebug - it was already loaded
xdebug



php -r ‘ phpinfo();’

https://xdebug.org/download
https://github.com/xdebug/xdebug



https://xdebug.org/docs/dbgpProxy
https://xdebug.org/docs/dbgpClient



https://xdebug.org/docs/dbgp
This document describes a simple protocol for use with language tools and engines for the purpose of debugging applications. It does not describe user interfaces or interactions with the debugger. The protocol provides a means of communication between a debugger engine (scripting engine, vm, etc.) and a debugger IDE (IDE, etc.). Any references to the debugger IDE UI are recommendations only, and are provided for additional explanation or as reasoning for specific design decisions.



https://xdebug.org/docs/all_settings
https://xdebug.org/docs/code_coverage
https://github.com/sebastianbergmann/php-code-coverage



https://phpunit.de/



https://xdebug.org/docs/basic



本地环境:



php -v


PHP 7.2.16 (cli) (built: Mar 10 2019 21:22:49) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Xdebug v2.8.0-dev, Copyright (c) 2002-2019, by Derick Rethans
环境搭建
// 如果没有安装过需要先行安装


yum install -y php-devel gcc



// 安装xdebug


cd /usr/local/src


git clone https://github.com/xdebug/xdebug.git


cd xdebug


./rebuild.sh


// xdebug配置文件


vim /etc/php.d/xdebug.ini



zend_extension=xdebug.so
xdebug.remote_enable=On
xdebug.remote_port=11955
xdebug.idekey=PHPSTORM
// 重启PHP服务


systemctl restart php-fpm


systemctl status php-fpm


然后重点来了,一定不要忘记开放上面配置的xdebug.remote_port端口号,开放此端口号、开放此端口号、开放此端口号。



开放端口每个系统都不太一样,在CentOS7中可以使用firewall-cmd来操作



firewall-cmd –zone=public –add-port=11955/tcp –permanent


firewall-cmd –reload


IDE 配置
IDE的配置与本地调试不太一样,总的来说有两种方式,一种是通过在IDE配置Remote Debug, 需要配置登录远端服务器;一种是通过ssh来做远程端口转发到本地来实现类似本地调试的方式。
在这里,我选用了后一种方式来操作。



远程端口转发
// HOST 为远程服务器在~/.ssh/config的配置host名, 可以替换为你的 比如 root@1.1.1.1
ssh -NT -R 11955:127.0.0.1:9001 HOST
这样就实现了远程xdebug端口11955到本地9001的映射。



IDE配置
与本地调试的配置不一样的地方就是host和port,其他地方大同小异。



IDEA-PHP-Servers的配置:
host 为远程web服务的域名, port 为远程web提供服务的端口号。
同时需要注意的是:需要勾选 path mappings, 并正确配置要debug的工程目录在远程和本地两个环境的映射关系。



IDEA-PHP-XDebug-DBGp-Proxy的配置:
更改host和port为远程web服务配置,与上一步相同



远程Xdebug环境配置
2.1 安装xdebug



sudo apt-get install php-xdebug

2.2 配置xdebug



xdebug位置: /etc/php/7.0/mods-available/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
2.3 Apache重启



sudo service apache2 restart
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:



在Run->Debug Configurations->PHP Web Application, 配置远程目标主机,Start URL设为/,设置完之后会在左侧新建一个PHP Web Application



到目前为止,该配置的都已经配置完成,这里面配置的选项比较多,一步一步配置,有顺序要求。配置完之后就是调试。点击下图右边红框中的小按钮,打开xdebug监听,再选择我们要调试的目标,这里是server,最后点击那个调试按钮,就能开启调试之旅。



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。



https://blog.csdn.net/supramolecular/article/details/81125793



本地调试



本地环境:



1
2
3
4
5
6
$ php -v
PHP 7.3.4 (cli) (built: Apr 8 2019 10:21:33) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.4, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.4, Copyright (c) 1999-2018, by Zend Technologies
with Xdebug v2.7.1, Copyright (c) 2002-2019, by Derick Rethans
环境搭建



1
2
// 安装xdebug
$ pecl install xdebug
1
2
// 配置xdebug
$ vim /usr/local/etc/php/7.3/conf.d/ext-xdebug.ini
1
2
3
4
5
6
[xdebug]
zend_extension=”xdebug.so”
xdebug.remote_enable=On
xdebug.remote_port=9001
xdebug.idekey=PHPSTORM
xdebug.remote_connect_back = 1
1
2
// 重启php服务
$ brew services restart php@7.3
IDE 配置



我是在~/Downloads/xdebug/ 目录下放了一个简单的PHP文件test.php来测试,在这个目录下用php -S 127.0.0.1:7790起了个http服务,可参考进行下述配置。



IDEA的几个配置项



开启监听



效果演示



设置之后, 在IDE里打上断点, 在浏览器打开这个链接即可开启测试



http://127.0.0.1:7790/test.php?XDEBUG_SESSION_START=PHPSTORM
效果如下:



浏览器没有必要安装 Xdebug Helper 插件。



远程调试



与上一篇联动, 本篇是远程调试, 主要记录一下过程



本地环境:



1
2
3
4
5


php -v


PHP 7.2.16 (cli) (built: Mar 10 2019 21:22:49) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Xdebug v2.8.0-dev, Copyright (c) 2002-2019, by Derick Rethans
环境搭建



1
2
3
4
5
6
7
8
// 如果没有安装过需要先行安装


yum install -y php-devel gcc



// 安装xdebug


cd /usr/local/src


git clone https://github.com/xdebug/xdebug.git


cd xdebug


./rebuild.sh


1
2
3
4
5
6
7
// xdebug配置文件


vim /etc/php.d/xdebug.ini



zend_extension=xdebug.so
xdebug.remote_enable=On
xdebug.remote_port=11955
xdebug.idekey=PHPSTORM
1
2
3
// 重启PHP服务


systemctl restart php-fpm


systemctl status php-fpm


然后重点来了,一定不要忘记开放上面配置的xdebug.remote_port端口号,开放此端口号、开放此端口号、开放此端口号。



开放端口每个系统都不太一样,在CentOS7中可以使用firewall-cmd来操作



1
2


firewall-cmd –zone=public –add-port=11955/tcp –permanent


firewall-cmd –reload


IDE 配置



IDE的配置与本地调试不太一样,总的来说有两种方式,一种是通过在IDE配置Remote Debug, 需要配置登录远端服务器;一种是通过ssh来做远程端口转发到本地来实现类似本地调试的方式。
在这里,我选用了后一种方式来操作。



远程端口转发



1
2
// HOST 为远程服务器在~/.ssh/config的配置host名, 可以替换为你的 比如 root@1.1.1.1
ssh -NT -R 11955:127.0.0.1:9001 HOST
这样就实现了远程xdebug端口11955到本地9001的映射。



IDE配置



与本地调试的配置不一样的地方就是host和port,其他地方大同小异。



IDEA-PHP-Servers的配置:



host 为远程web服务的域名, port 为远程web提供服务的端口号。
同时需要注意的是:需要勾选 path mappings, 并正确配置要debug的工程目录在远程和本地两个环境的映射关系。



IDEA-PHP-XDebug-DBGp-Proxy的配置:
更改host和port为远程web服务配置,与上一步相同



效果演示



设置之后, 在IDE里打上断点, 在浏览器打开这个链接即可开启测试



http://example.com/test.php?XDEBUG_SESSION_START=PHPSTORM
效果如下:



同样的,浏览器没有必要安装 Xdebug Helper 插件。



https://www.jb51.net/article/160077.htm
https://www.cnblogs.com/schaepher/p/8939616.html
https://www.php.cn/php-weizijiaocheng-417737.html
https://www.cnblogs.com/schaepher/p/8939616.html
https://www.jb51.net/article/160077.htm



remote_connect_back=1会自动将debug信息转发到发起请求的机器,可以同时多人进行调试;指定remote_host则会固定转发到指定机器,只能单人使用。



路径 PhpStorm->preferences->Languages & Frameworks→PHP,选择添加远端解释器



php.ini
xdebug.idekey=xiazemin



使用浏览器访(安装xdebug_helper插件并打开)
或者使用postman访问,手动加上 Cookie:XDEBUG_SESSION=xiazemin



当浏览器发送一个带XDEBUG_SESSION的参数的请求到服务器时,服务器接受后将其转到后端的php处理,如果php开启了xdebug模块,则会将debug信息转发到客户端IP的IDE的调试端口上。当参数或者cookie信息中不带XDEBUG_SESSION,则不会启动调试。这就为后续在浏览器中添加开关提供了可能。



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/



$ netstat -ano |grep 8098
tcp 0 0 0.0.0.0:8098 0.0.0.0:* LISTEN off (0.00/0/0)
tcp 0 0 10.179.21.231:8098 172.30.47.137:55071 ESTABLISHED keepalive (168.62/0/0)



~$ netstat |grep 8098
tcp4 0 0 bogon.55071 bogon.8098 ESTABLISHED



http://blog.xiayf.cn/assets/uploads/files/PHP-Debug-Manual-public.pdf



2.0 配置远程deployment



配置路径:Tools->deployment->configuration



1)配置服务器
sftp
2)配置映射
路径映射
.1 配置PHP解释器



选择远程服务器上的解释器



2.2 配置Server



需要把项目路径映射到远端服务器



2.3 配置DBGp Proxy
2.4 配置XDEBUG端口
2.5 配置Debug Configurations
填url



选择PHP Web Page web application



Start URL就是准备调试的api,



3.1选择上面配置的PHP Web Page,点击小电话,电话变成绿色就是监听中
3.2 点击小昆虫,开始调试



断点失败



$ sudo tcpdump host 192.168.0.108
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes



20:03:12.831646 IP 10.179.21.231.37366 > 192.168.0.108.8098: Flags [S], seq 2497314359, win 29200, options [mss 1460,sackOK,TS val 4169093149 ecr 0,nop,wscale 7], length 0
20:03:13.369014 IP 10.179.21.231.37534 > 192.168.0.108.8098: Flags [S], seq 2659741523, win 29200, options [mss 1460,sackOK,TS val 4169093687 ecr 0,nop,wscale 7], length 0
20:03:13.569434 IP 10.179.21.231.37578 > 192.168.0.108.8098: Flags [S], seq 2598464065, win 29200, options [mss 1460,sackOK,TS val 4169093887 ecr 0,nop,wscale 7], length 0



原因:本地是dhcp,不在一个局域网,没法访问



https://www.cnblogs.com/jice/p/5064838.html



https://www.jianshu.com/p/d9d12518aa55



https://blog.csdn.net/hyholine/article/details/7272195
https://ask.csdn.net/questions/390209



https://ask.csdn.net/questions/788501



mac下 netstat -ano 不好用



mac 端(phpstorm)192.168.0.108
$sudo lsof -nP -iTCP |grep 8098
phpstorm 1065 didi 76u IPv4 0x704486722f2c59ad 0t0 TCP 172.30.47.137:55071->10.179.21.231:8098 (ESTABLISHED)
phpstorm 1065 didi 81u IPv4 0x7044867231191b6d 0t0 TCP *:8098 (LISTEN)



docker端10.179.21.231
$ netstat -ano |grep 8098
tcp 0 0 0.0.0.0:8098 0.0.0.0:* LISTEN off (0.00/0/0)
tcp 0 0 10.179.21.231:8098 172.30.47.137:55071 ESTABLISHED keepalive (87.59/0/0)
端口冲突了?改掉7598



https://my.oschina.net/surjur/blog/3062984



https://blog.csdn.net/aochijing0046/article/details/101493576



https://www.cnblogs.com/chianquan/p/5630951.html



1、公司内网,动态ip,有很多的接口权限都是需要对应的网络策略的,代码框架并没有很好的支持生产环境和测试环境的分离,本机调试的话,很难实现,且与服务器上的环境差异比较大,需要在专门的测试机上做调试;



2、测试机无法访问本地机器,考虑使用ssh链接然后端口转发来解决该问题。(端口转发之前没用过,刚好学习下)



配置部署:



1、扩展安装方式和其它的php扩展一样几步走,网上的教程很多,这里就不多说了;



2、Php.ini中的配置信息



; zend_extension =/usr/local/php/extensions/xdebug.so



[xdebug]



xdebug.default_enable=0



xdebug.remote_enable=1 ;远程调试开关,必须开启



xdebug.remote_handler=dbgp ;远程调试xdebug与IDE使用的协议,默认就是dbgp



xdebug.remote_host=127.0.0.1 ;远程调试xdebug回连的主机ip,如果开启了remote_connect_back,则该配置无效



xdebug.remote_port=9000 ;远程调试回连的port,默认即为9000,如果有端口冲突,可以修改,对应ide的debug配置里面也要同步修改



xdebug.remote_connect_back=0 ;是否回连,如果开启该选项,那么xdebug回连的ip会是发起调试请求对应的ip



xdebug.remote_autostart=1



xdebug.idekey=netbeans ;调试使用的关键字,发起IDE上的idekey应该和这里配置的idekey一致,不一致则无效



xdebug.remote_log=/data/xdebug_log/remote.log



3、重启apache,打印phpinfo(),可以看见xdebug是否生效和参数情况。



4、这里我们使用SecureCRT来直接做端口转发的配置:



I、SecureCRT连接上安装了PHP的服务端;



II、选择:菜单->options->session options->这里有两个端口转发;



一个是“port forwarding”监听本地对应ip:port接受到的信息,转发到对应服务端的对应ip:port;(ps:这里目标服务器ip可以是ssh链接上的服务器网络环境下能访问的所有ip)



另一个是“Remote/X11”监听服务端的对应ip:port接受道德信息,转发到本地服务器的对应端口;(ps:这里的本地服务器的ip也可以是本地网段中的其它ip)



这里我们配置Remote/X11->add 名字随便,默认不配置ip则为localhost



5、配置IDE,主要配置为:IDE中的菜单->工具->选项



1、xdebug整个工作过程是你本地IDE与PHP扩展xdebug共同协作的一个过程;



2、在通常情况下是不会触发xdebug的远程调试的。触发方式为:



I、在命令行的环境下,通过配置环境变量来触发;



export XDEBUG_CONFIG=”idekey=session_name”php myscript.php



II、通过http请求的get、post带对应参数来触发



XDEBUG_SESSION_START=session_name



这里主要是当php接收到请求的时候xdebug判断请求参数带有xdebug_session,则会在cookie上设置idekey=session_name



III、也可以通过xdebug对应的浏览器插件,帮忙直接在cookie中设置idekey=session_name



3、这里假设我们的调试为http调试,IDE发起调试的时候,通过浏览器访问请求,例如:http://localhost/test.php?XDEBUG_SESSION_START=session_name,并监听9000端口;



4、Xdebug截获到该请求,将设置cookie中idekey=session_name,主动连接remote_ip:remote_port,连接到IDE,跟IDE对话;



对话内容主要为ide告诉xdebug,在哪些文件设置了断点,在执行第一行代码时候要停止,进行下一步操作,进入函数,跳出函数等信息



Xdebug则在程序运行到断点的时候告诉IDE当前在哪里停止和各变量的值等等信息。



https://www.testwo.com/blog/8079



1 通过ssh命令进行登录



mac 上直接用ssh 命令请求:



ssh -p 跳板机端口 username@跳板机IP



接下来 会让你输入密码:



(接下来,我们公司的跳板机 ,还要输入 工号,公司动态密码;看情况,可能你们的跳板机不需要这些。)



输入密码后,我还是 不允许访问 跳板机。请教管理跳板机的人员后,让我把 我的公钥给他。应该是给我,存到跳板机上了。然后再次ssh请求 就直接进去了。



然后,我的目的是访问,外网的测试环境。现在还是不行。还要让跳板机 给我 做一个转发。



2.通过ssh命令进行转发:



比如线上机器的地址是10.187.21.18 端口号是8080  ;映射到 跳板机的本机地址127.0.0.1  端口号是18080



ssh -p 跳板机端口 username@跳板机IP -L 127.0.0.1:18080:10.187.21.18:8080 -N



然后把访问的外网地址   改成访问这个地址:127.0.0.1:18080



https://www.cnblogs.com/q1104460935/p/11830620.html



https://www.cnblogs.com/keerya/p/7612715.html
https://www.restran.net/2017/09/16/php-xdebug-cmd-exec/
https://paper.seebug.org/308/



cksum 0xe1dc (incorrect -> 0x76c3)



https://blog.csdn.net/gobitan/article/details/3212045?utm_source=blogxgwz2



安装向导
https://xdebug.org/wizard



brew install php@7.1
最后根据上述安装后的结果执行



echo ‘export PATH=”/usr/local/opt/php@7.1/bin:$PATH”’ » ~/.bash_profile
echo ‘export PATH=”/usr/local/opt/php@7.1/sbin:$PATH”’ » ~/.bash_profile
export LDFLAGS=”-L/usr/local/opt/php@7.1/lib”
export CPPFLAGS=”-I/usr/local/opt/php@7.1/include”
source ~/.bash_profile



Category php