> 工欲善其事必先利其器,学习一门新语言,调试器的使用必不可少,本文分享一下PHP调试器的使用。php
PHP目前有两种流行的调试器,chrome
我在学习和研究过程当中,发现网上的各类信息过于凌乱,感到痛苦,影响理解和使用。今天我以Xdebug为例,先解释其基本的工做原理,再说明生产过程当中如何使用,但愿能带给你们清晰易懂的知识。shell
Xdebug是一个PHP扩展,它采用DBGp协议,提供了对PHP进行Debugging和Profiling的能力。浏览器
Debug信息包含:session
stack and function traces in error messages with:ide
此外,Xdebug还提供如下功能:php-fpm
今天只讨论Debug,其它功能之后有机会再分享。post
原文参考:https://xdebug.org/docs/remote单元测试
简单来讲,XDebug调试是一种C/S结构,Client是PHP-Xdebug插件,Server是咱们的IDE(或者各类Editor插件),中间经过DBGp协议通讯。PHP脚本在运行时,由Xdebug插件向IDE发起链接,将调试信息发送给IDE,并经过DBGp协议进行互动。学习
看下图,就明白了:
以上是单人模式,在php.ini中配置了IDE的IP地址以及监听的端口。这种模式的缺陷是配死了IDE目标,不能支持多用户调试。因此Xdebug还提供了一种多用户的调试模式,这种模式无需配置remote_host,而是配置xdebug.remote_connect_back=On,Xdebug会记下来访地址,做为调试时的链接目标。调试过程以下:
搞明白了原理,那咱们就开始实践吧。
根据各自不一样的工做站平台,参考官方安装指导.
安装的时候注意一下输出信息,记下安装好的扩展包位置,下一步配置PHP时会用到。
打开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,看看

网页输出phpinfo()

以上输出若能看到Xdebug版本信息,就ok了。另外,在phpinfo中,能够看到xdebug的配置信息,搜搜看,这些配置都是能够在php.ini中进行修改的,各自表明的意思你们能够查官网,这里就不详述了。
以PHPStorm为例,PHPStorm实现了DBGp协议,咱们须要配置它监听的端口,这个端口号须要与xdebug.remote_port一致,才能确保调试时PHP-Xdebug能连上IDE。
如下是默认配置,若是没有冲突能够不用改。在帮其余同窗trouble shooting时,发现php-fpm和xdebug默认都使用9000号端口,真是一个奇怪的配置啊,难道他们俩不该该常常被同时使用吗?若是你发现本身的debug不能正常工做,不妨检查一下这一点,将他们调整为不一样的端口。
以前说过,IDE是做为一个Server的角色监听特定端口,等待Xdebug来链接,对于PHPStorm开启监听很是简单,直接点击右上角的“小电话”按钮:
变成
而后在代码里面打下断点。
接下来,开始运行并调试代码。针对不一样类型的应用,方法也不同。但目的都是相同的,就是要告诉PHP-Xdebug,我要开始调试了,给我把调试信息发过来!
两种方法:
其实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上带参数了。
支持的插件:
试试以上两种方法,断点命中!开始享受调试。
通常用在命令行程序或者单元测试的调试中。
咱们须要经过设置环境变量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