>欲善其事,必先利其器。要学习一门新语言,使用调试器是必不可少的。本文分享一个PHP调试器的使用。PHP目前有两个流行的调试器,XdebugZendDebugger。在学习和研究过程中,我发现网上的各种资料太过凌乱和痛苦,影响了理解和使用。今天我就以Xdebug为例,先讲解它的基本工作原理,然后再讲解如何在生产过程中使用它,希望能给大家带来清晰易懂的知识。XdebugXdebug是一个PHP扩展,它使用DBGp协议来提供调试和分析PHP的能力。调试信息包括:错误消息中的堆栈和函数跟踪:用户定义函数的完整参数显示函数名、文件名和行指示支持成员函数内存分配无限递归保护此外,Xdebug还提供以下功能:分析信息forPHPscriptscodecoverageanalysis用调试器前端交互调试你的脚本今天只讨论Debug,其他功能稍后再分享。调试原理原文参考:https://xdebug.org/docs/remote简单来说,XDebug调试是一个C/S结构,Client就是PHP-Xdebug插件,Server就是我们的IDE(或者各种Editor插件),中间通过DBGp协议进行通信。当PHP脚本运行时,Xdebug插件向IDE发起连接,向IDE发送调试信息,通过DBGp协议进行交互。看下图你就明白了:服务器的IP是10.0.1.2,HTTP在80端口IDE在IP10.0.1.42,所以xdebug.remote_host设置为10.0.1.42IDE在9000端口监听,所以x调试。remote_port设置为9000在运行IDEX的机器上启动HTTP请求debug连接到10.0.1.42:9000调试运行,提供HTTPResponse上面是单机模式,IDE的IP地址和监听端口配置在php.ini。这种模式的缺点是IDE目标不匹配,不支持多用户调试。因此,Xdebug也提供了多用户调试模式。这种模式不需要配置remote_host,但是配置xdebug.remote_connect_back=On,Xdebug会在调试时记录访问地址作为连接目标。调试过程如下:服务器IP为10.0.1.2,HTTP在80端口IDE在未知IP,所以xdebug.remote_connect_back设置为1IDE监听9000端口,所以xdebug.remote_port设置为9000HTTP请求发出,Xdebug从HTTP头中检测IP地址Xdebug在9000端口连接到检测到的IP(10.0.1.42)调试运行,HTTPResponse提供搞清楚原理,接下来就开始实践吧。根据不同的工作站平台安装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=Onxdebug.remote_enable=On,表示打开远程调试开关,这个是必须的。然后,有两种方法可以验证插件是否加载成功:在命令行执行php-v,看看网页输出phpinfo()如果在以上输出,没问题。另外在phpinfo中可以看到xdebug的配置信息,搜索看看,这些配置在php中是可以修改的。配置IDE以PHPStorm为例。PHPStorm实现了DBGp协议。我们需要配置它监听的端口。这个端口号需要和xdebug.remote_port保持一致,以保证PHP-Xdebug在调试时可以连接到IDE。以下为默认配置,如无冲突,无需更改。在帮其他同学排错的时候,发现php-fpm和xdebug都默认使用9000端口,真是奇怪的配置。它们不应该同时使用吗?如果您发现调试工作不正常,请检查一下并将它们调整到不同的端口。正如我在启动Debug之前所说的,IDE充当服务器来监听特定端口并等待Xdebug连接。PHPStorm的启动监控非常简单,点击右上角的“小手机”按钮:更改,然后在代码中设置断点即可。接下来,开始运行和调试代码。对于不同类型的应用,方法也不同。但是目的是一样的,就是告诉PHP-Xdebug我要开始调试了,把调试信息发给我!WebApp的两种方法:在请求的URL地址后面加上一个QueryString:XDEBUG_SESSION_START=session_name(当然也可以使用POST参数),这样PHP-Xdebug就知道是时候连接IDE进行调试了.事实上,IDE提供了一种快捷的操作方法,无需您手动编写URL参数。参见DebuggingPHPWebApplicationswithRunDebugConfigurations,简单来说,你需要配置WebServer,PHPWebApplication,然后点击右上角的“小瓢虫”按钮,IDE会自动打开浏览器帮你输入GoodURL,并添加QueryString:XDEBUG_SESSION_START=session_name。安装浏览器插件,插件会在你请求PHP页面时带上一个XDEBUG_SESSIONCookie,这样你就不需要在URL上有参数了。支持的插件:Firefox:the-easiest-xdebugChrome:XdebughelperSafari:xdebug-toggler-for-safariOpera:xdebug-launcher尝试以上两种方法,断点命中!开始享受调试吧。Console一般用在命令行程序的调试或者单元测试中。我们需要通过设置环境变量XDEBUG_CONFIG来通知Xdebug进行调试。当然,我们可以在这个环境变量中添加更多的设置来配置Xdebug(这些配置可以在php.ini中设置)。exportXDEBUG_CONFIG="idekey=session_name"phpmyscript.php断点命中!如果你不想调试了,释放这个环境变量。unsetXDEBUG_CONFIG提示,如果你使用Zsh,你可以为上面两个小代码设置一个别名。aliasxdebug-on="exportXDEBUG_CONFIG=\"idekey=PHPSTORM\""aliasxdebug-off="unsetXDEBUG_CONFIG"PHPStorm也提供快捷操作,参见DebuggingPHPCLIscriptswithPhpStorm
