摘要:目前有两种流行的调试器,我在学习和研究过程中,发现网上的各种信息过于凌乱,感到痛苦,影响理解和使用。脚本在运行时,由插件向发起连接,将调试信息发送给,并通过协议进行互动。这种模式的缺陷是配死了目标,不能支持多用户调试。
> 工欲善其事必先利其器,学习一门新语言,调试器的使用必不可少,本文分享一下PHP调试器的使用。
PHP目前有两种流行的调试器,
Xdebug
Zend Debugger
我在学习和研究过程中,发现网上的各种信息过于凌乱,感到痛苦,影响理解和使用。今天我以Xdebug为例,先解释其基本的工作原理,再说明生产过程中如何使用,希望能带给大家清晰易懂的知识。
XdebugXdebug是一个PHP扩展,它采用DBGp协议,提供了对PHP进行Debugging和Profiling的能力。
Debug信息包含:
stack and function traces in error messages with:
full parameter display for user defined functions
function name, file name and line indications
support for member functions
memory allocation
protection for infinite recursions
此外,Xdebug还提供以下功能:
profiling information for PHP scripts
code coverage analysis
capabilities to debug your scripts interactively with a debugger front-end
今天只讨论Debug,其它功能以后有机会再分享。
Debug原理原文参考:https://xdebug.org/docs/remote
简单来说,XDebug调试是一种C/S结构,Client是PHP-Xdebug插件,Server是我们的IDE(或者各种Editor插件),中间通过DBGp协议通信。PHP脚本在运行时,由Xdebug插件向IDE发起连接,将调试信息发送给IDE,并通过DBGp协议进行互动。
看下图,就明白了:
The IP of the server is 10.0.1.2 with HTTP on port 80
The IDE is on IP 10.0.1.42, so xdebug.remote_host is set to 10.0.1.42
The IDE listens on port 9000, so xdebug.remote_port is set to 9000
The HTTP request is started on the machine running the IDE
Xdebug connects to 10.0.1.42:9000
Debugging runs, HTTP Response provided
以上是单人模式,在php.ini中配置了IDE的IP地址以及监听的端口。这种模式的缺陷是配死了IDE目标,不能支持多用户调试。所以Xdebug还提供了一种多用户的调试模式,这种模式无需配置remote_host,而是配置xdebug.remote_connect_back=On,Xdebug会记下来访地址,作为调试时的连接目标。调试过程如下:
The IP of the server is 10.0.1.2 with HTTP on port 80
The IDE is on an unknown IP, so xdebug.remote_connect_back is set to 1
The IDE listens on port 9000, so xdebug.remote_port is set to 9000
The HTTP request is made, Xdebug detects the IP addres from the HTTP headers
Xdebug connects to the detected IP (10.0.1.42) on port 9000
Debugging runs, HTTP Response provided
搞明白了原理,那我们就开始实践吧。
安装Xdebug根据各自不同的工作站平台,参考官方安装指导.
安装的时候注意一下输出信息,记下安装好的扩展包位置,下一步配置PHP时会用到。
配置PHP-Xdebug打开php.ini(不知道php.ini在哪里的,可以输出phpinfo()看看),然后加上对Xdebug扩展的配置:
[Xdebug] zend_extension="/usr/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so" xdebug.remote_enable=On
xdebug.remote_enable=On,表示打开远程调试开关,这是必须的。
然后,有两种方法可以验证一下插件是否加载成功:
命令行执行php -v,看看
![pic](http://imgur.com/3UbEnNo.png)
网页输出phpinfo()
![pic](http://imgur.com/r3I8FZF.png)
以上输出若能看到Xdebug版本信息,就ok了。另外,在phpinfo中,可以看到xdebug的配置信息,搜搜看,这些配置都是可以在php.ini中进行修改的,各自代表的意思大家可以查官网,这里就不详述了。
配置IDE以PHPStorm为例,PHPStorm实现了DBGp协议,我们需要配置它监听的端口,这个端口号需要与xdebug.remote_port一致,才能确保调试时PHP-Xdebug能连上IDE。
以下是默认配置,如果没有冲突可以不用改。在帮其他同学trouble shooting时,发现php-fpm和xdebug默认都使用9000号端口,真是一个奇怪的配置啊,难道他们俩不应该经常被同时使用吗?如果你发现自己的debug不能正常工作,不妨检查一下这一点,将他们调整为不同的端口。
开始Debug之前说过,IDE是作为一个Server的角色监听特定端口,等待Xdebug来连接,对于PHPStorm开启监听非常简单,直接点击右上角的“小电话”按钮:
变成
然后在代码里面打下断点。
接下来,开始运行并调试代码。针对不同类型的应用,方法也不一样。但目的都是相同的,就是要告诉PHP-Xdebug,我要开始调试了,给我把调试信息发过来!
Web App两种方法:
在请求的URL地址后面加一个QueryString:XDEBUG_SESSION_START=session_name(当然用POST参数也可以),这样PHP-Xdebug就会知道该连接IDE调试了。
其实IDE提供了快捷的操作方式,不用你手动写URL参数。见Debugging PHP Web Applications with Run Debug Configurations,简单来说,就是你需要配置好Web Server,PHP Web Application,再点击后上角的“小瓢虫”按钮,IDE就会自动打开浏览器,帮你输好网址,并添加QueryString:XDEBUG_SESSION_START=session_name。
安装浏览器插件,插件会在你请求一个PHP页面时,带上一个XDEBUG_SESSION Cookie,这样就不用在URL上带参数了。
支持的插件:
Firefox: the-easiest-xdebug
Chrome: Xdebug helper
Safari: xdebug-toggler-for-safari
Opera: xdebug-launcher
试试以上两种方法,断点命中!开始享受调试。
Console一般用在命令行程序或者单元测试的调试中。
我们需要通过设置环境变量XDEBUG_CONFIG来通知Xdebug进行调试。当然,我们可以向这个环境变量中添加更多的设置来配置Xdebug(这些配置都可以在php.ini中进行设置)。
export XDEBUG_CONFIG="idekey=session_name" php myscript.php
断点命中!
不想调试了,释放掉这个环境变量。
unset XDEBUG_CONFIG
小技巧,如果你用Zsh,可以为上述两段小代码设置别名。
alias xdebug-on="export XDEBUG_CONFIG="idekey=PHPSTORM"" alias xdebug-off="unset XDEBUG_CONFIG"
PHPStorm也提供了快捷的操作,见Debugging PHP CLI scripts with PhpStorm
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/25926.html
摘要:写代码总绕不过需要调试,除了外,我们还是需要借助进行调试。这里的使用,是分别整合到和下。安装还是基于神级武器。至于下一步如何更好的使用,就看各自的实际项目和开发需要了。 写代码总绕不过需要调试,除了 UnitTest 外,我们还是需要借助 Xdebug 进行调试。 所以今天来说说如何基于本地 Docker 环境下,使用 Xdebug。 这里的使用,是分别整合到 VS Code 和 PH...
摘要:当我在官网看到了远程调试原理图时,我才知道应该怎么配置。配置的参数也少了很多,也不需要在里对一个个请求地址进行配置。其他可以配置可以共用。但是如果你使用的是本地的那他就会出现端口被占用的情况。 介绍 我之前配置直接按网上的文章进行配置总是配置不成功,里面很多东西不了解。当我在 xdebug 官网看到了 xdebug 远程调试原理图时,我才知道应该怎么配置 xdebug。配置的参数也少了...
摘要:远程调试分为两部分调试客户端和服务端。主动去连接的端口,连接成功后,调试开始。当然,单步调试的另一个好处是可以让初学者快速掌握项目的架构和执行流程。 博客原文链接 在使用php调试代码的时候,我通常都是使用简单暴力的echo之类的输出调试。这种调试方法的效率与个人能力正相关,你加一个echo多数是为了验证自己的一个推测,那么你对代码越熟悉,你推测的就会越准确,bug解决的就越快,相反...
摘要:红色方形,表示中断当前程序调试。第三个图形示,強制进入当前函数內部的程序。框架说明加载的文件列表可以观察到所有全局变量当前局部变量的数值可以新增变量,观察变量随着程序执行的变化。参考文章使用与调试一 序言 Xdebug 作为 PHP 调试工具,提供了丰富的调试函数和配置,可以直观的看到 PHP 源代码的步进和性能数据,以便优化PHP代码。 使用 phpstorm + xdebug 来调...
摘要:是一个开放源代码的程序调试器即一个工具,可以用来跟踪,调试和分析程序的运行状况。以下为安装示例,安装请参考集成开发和断点调试环境的配置。指令的配置路径必须是绝对路径。 Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况。以下为Windows+Phpstorm+Xampp+Xdebug安装示例,MAC安装请参考集成开发和断...
阅读 2112·2021-11-15 11:36
阅读 1354·2021-09-23 11:55
阅读 2454·2021-09-22 15:16
阅读 1989·2019-08-30 15:45
阅读 1801·2019-08-29 11:10
阅读 957·2019-08-26 13:40
阅读 876·2019-08-26 10:44
阅读 3094·2019-08-23 14:55