PHPStorm+Xdebug进行emote Debug时无法进入断点问题排查

admin3年前PHP教程63

最近一直在研究xdebug的用法,主要是因为xdebug对php的开发效率提升确实很大,而却能帮我们解决很多问题。所以这里就总结下我在配置phpstorm+xdebug环境中遇到的坑,给遇到进不去断点的朋友一些排查的建议。

运行环境php version 7.1.22xdebug v2.6.0php2016.2;操作系统:macos 10.12.3

如果遇到无法进入断点的问题,可以按照以下的步骤进行排查

确认运行web程序的php安装了xdebug扩展

php永久了,难免会在电脑上多装几个版本。这个时候就必须注意,你是否将xdebug安装到了你需要调试的php版本中,而且要注意,命令行运行的php,不一定是web程序运行的php。例如你安装了php的5.6和7.1两个版本,命令行跑的是5.6,但fpm跑的是7.1。这时如果你给5.6安装xdebug,你运行php -m | grep xdebug确实可以看到xdebug扩展,但是如果想调试7.1运行的web程序,当然是不可能的。所以这里最关键一点,就是:

在web程序中输出phpinfo();exit; ,来确认运行fpm的php中是否安装了xdubug扩展。

确认xdebug扩展的版本与php版本匹配

如果你安装了xdebug,但是版本与php不匹配,也是没办法正常工作的。如何正确的选择php对应的xdebug版本。

确认xdebug配置了有效的参数

在phpstorm中调试不同的php程序,需要配置不同的xdebug参数。在remote debug模式下:

必须要设置的参数有:

remote_enable=1 开启远程调试,不开启这个参数的话,自然无法remote debug;remote_host=127.0.0.1(本机情况) or remote_connect_back=1,由于这两个配置项有紧密联系,所以放在一起讲。 首先,如果你指针对单个调试用户,比如就你自己调试,你可以将remote_host设成你的web程序运行的ip(比如本机,就设置为127.0.0.1),remote_connect_back的值不设置或者设置为0(你不设置默认也是0)。这样xdebug每次调试的时候会固定连接remote_host指定的ip;但是如果你支持的是多人调试,明显设置一个remote_host是没办法的。这个时候就可以用remote_connect_back=1来设置。当remote_connect_back设置为1的时候,xdebug会根据请求来的ip自动回连,进行调试,从而支持多人调试。同时,这个值设为1的话会使remote_host的设置无效;一般情况下,推荐使用remote_connect_back=1的配置remote_port=9001 php进程与debugclient通信的端口号,必须要设置与phpstorm中的一致,否则无法正常通信;idekey=phpstorm 可以理解为通信用到的口令,必须要设置与phpstorm中的一致;

推荐设置的参数:

remote_autostart=1
默认状态下,触发调试需要在url中增加get参数:xdebug_session_start= {xdebug.idekey},如果想自动启动调试,即不加这个参数也能自动触发调试,可以将这个值设为1,所以推荐将这个值设为1;

确认phpstorm监听的端口是xdebug中配置的端口

一定要在此确认xdebug中配置的remote_port(最好使用打印出phpinfo来查看)和phpstorm中配置的一致,否则无法进入调试。

确认phpstorm中的debugclient顺利启动

在phpstorm的工具栏中启动了remote debug之后,需要检查是否顺利启动了debugclient进程。这个进程就是phpstorm启动来进行调试的,所以只需要查看phpstorm是否监听了我们设置的端口(remote_port)就可以了。例如我指定的端口是9001,那么在mac上可以通过lsof -i tcp:9001命令查看:

确认phpstorm中的idekey和xdebug中配置的一致

一定要确认phpstorm中配置的idekey和xdebug中配置的idekey是一样的,否则无法进入调试。

代码部署在远程,需要开启目录映射

如果你是调试远程的web程序(即代码不是部署在本机),必须要设置目录映射,否则找不到代码所在,是无法调试的。设置的方法如下图:

确认phpstorm和xdebug+php的版本匹配

使用xdebug调试,是php进程通过xdebug扩展和phpstorm的debugclient通信的过程,所以必须这三方在版本上兼容才可以。有的时候碰到一些奇葩的问题,比如我就碰到过可以进入断点,但是无法单步调试(点击下一步调试进程就卡死)的情况。这种情况很有可能是phpstorm的版本和xdebug+php的版本不兼容。比如我碰到的这个问题就是因为我用了最新版本的xdebug2.7,但是使用的phpstorm却是2017.2的版本,而我将xdebug降到2.6之后就可以正常调试了。所以,最好保证phpstorm、xdebug和php的版本协调一致。

总结

如果按照上面说的还是不行,那么就需要查看remote_log,来看下问题到底出在哪了。
这个时候需要在xdebug的配置中增加:xdebug.remote_log=/tmp/xdebug.log来打开remote_log。
配置完成之后,重新启动fpm,查看phpinfo,确认remote_log生效之后(默认是不启动remote_log的)之后,调试的时候就可以tail -f /tmp/xdebug.log来查看日志了。举个例子,我故意将remote_port设置为一个不存在的9999端口,然后查看remote_log的报错信息:

从日志中看出,xdebug尝试去连接127.0.0.1的9999端口,但是失败了。这样,我们就能看出到底问题出在哪里,当我们是在找不到配置的问题时,可以借助日志,再结合google、百度,看看能否找到问题的所在。

以上就是phpstorm+xdebug进行emote debug时无法进入断点问题排查的详细内容,更多关于php断点排查的资料请关注其它相关文章!

免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

使用SEO建站租用境外站群服务器有哪些好处境外站群服务器租用哪里有

租用境外站群服务器的好处有:1、能保证站群网站的安全,站群网站的权重和排名;2、稳定性好,能保证用户稳定的访问体验;3、链接跳转速度快,保证用户能通过其中的任意一个站点迅速地到达其他站点;4、提供售后...

PHP加MySQL消息队列深入理解

消息队列:在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以...

租用美国站群服务器需要考虑哪些方面

租用美国站群服务器需要考虑哪些方面?1、制定适合自身企业的方案企业想要购买或是租用美国站群服务器,都是需要知道自身的企业需要什么样子的美国站群服务器,根据企业自身的发展情况,涉及的业务,网站的类型,根...

php之深入理解架构布局讲解

本文基于《php 内核剖析》与 《php7底层设计与源码实现》所记笔记。对php内核的深入理解有助于我们对php的整体认识,对于业务层初期发展我们可以只了解基本语言的逻辑就可以写出符合业务的代码,但是...

台湾大带宽服务器可靠吗主要看哪些

台湾大带宽服务器可靠吗主要看哪些?要评估台湾大带宽服务器的可靠性,需要考虑以下几个因素:服务器硬件质量:服务器硬件质量是服务器性能和稳定性的基础,硬件质量好的服务器通常更可靠。带宽提供商:带宽提供商的...

怎么购买香港大带宽服务器

怎么购买香港大带宽服务器?要购买香港大带宽服务器,您可以按照以下步骤进行:搜索供应商:在网上搜索香港大带宽服务器提供商,并根据服务质量、可靠性、安全性、支持和价格等因素进行评估。选择适当的配置:根据您...