PHP的debug调试方法

发表于2017-08-28 11:37  |  次阅读  |  0条评论  |   作者:siru90

最近负责的工作任务涉及了PHP的开发,周边的小伙伴们都依赖一台专用的linux服务器进行开发环节的测试验证,有不少代码点都依赖echo打印的原始方法进行调试定位。由于在java、python开发时,IDE都有非常方便高效的debug调试工具,因此,在PHP开发也希望能以相同方式进行开发。
 
 首先搞定本地开发环境,直接安装windows版的WampServer套件,这个套件安装和配置都非常简单,关键是很稳定。成为我的首选。(大家也可以尝试windows版的nginx+PHP+FastCGI的配置方式,有一个phpStudy套件支持各种各样的环境搭配。)
 
这个套件已经完整集成了Apache、PHP、mysql,并且都已无缝集成,直接在托盘即可启动


由于是一个懒人套件,xdebug、php-zip等扩展都已完整集成。直接开启即可。 


打开php.ini文件开启xdebug的配置,WAMP默认有效的php.ini位于D:\wamp\bin\apache\apache2.4.2\bin文件夹中(切记不是php目录下面的那个)。加入以下的内容。 

zend_extension = "D:/wamp/bin/php/php5.4.3/zend_ext/php_xdebug-2.2.0-5.4-vc9-x86_64.dll"
 
[xdebug]
xdebug.remote_enable = On
xdebug.remote_handler = "dbgp"
xdebug.remote_host = "localhost"
xdebug.remote_port = 9000
xdebug.profiler_enable = off
xdebug.profiler_enable_trigger = off
xdebug.profiler_output_name = cachegrind.out.%t.%p
xdebug.profiler_output_dir = "D:/wamp/tmp"
Web环境配置好了,就可以配置IDE了。我选择了PhpStorm作为PHP的开发工具,话说eclipse(ZendStudio)是大家的首选,但是经过之前java、python的开发,真心觉得eclipse不好用,智能提示和稳定性都不行,jetbrains公司出品的PhpStorm在各方面都很好用,尤其是Web前端开发,在此不赘述,用过你就知道。
 进入Settings中配置PHP的Debug参数,在DBGp Proxy中配置IDE Key、Host、Port。IDEkey怎么填?可以与后面介绍的浏览器扩展插件结合起来,在扩展插件中选择什么key,这里就填什么。


在工具栏上有一个按钮,点击后就会启动debug监听,如果浏览器已经配置了xdebug插件,并且已经启动xdebug模式,那么在代码中设定断点,刷新前端页面就进入断点处的代码,就可以单步调试了。 


接下来我们需要搞定浏览器,这里以大家常用的chromn浏览器为例。首先安装xdebug扩展Xdebug helper。这个扩展应用可以在chromn的应用商店中搜索下载。(有些同学是firefox的忠实用户,可以安装easy Xdebug插件) 


安装直接,在工具->扩展程序中可以找到已安装的扩展,点击选项进行配置,主要是为了配置IDE key,让IDE的debug工具能够与浏览器的扩展插件进行连接通信。 

 
以上配置都搞定后,具体怎么实现PHP的调试呢?
1、 在浏览器打开准备调试的页面。
2、 开启浏览器的xdebug。快捷键ctrl+shift+x
3、 打开IDE的debug监听。设置代码断点
4、 刷新页面,IDE监听到浏览器的xdebug调试连接请求,发现断点,进入代码调试。 

有几点需要注意的:
1、 php必须安装xdebug扩展,并且正确配置了xdebug。详见上面的php.ini配置
2、 浏览器正确安装xdebug扩展插件,正确配置IDE Key,必须与IDE的配置一致
3、 IDE正确配置dbgp,IDE key与浏览器配对。
4、 在IDE断点调试时,有时会提示配置本地代码路径,注意要正确选择本地代码路径配置一次就OK 

大家都知道在windows和linux上面相同的PHP代码不一定有相同的结果,不是所有人都会配备一台个人专用的linux开发机,自己建linux虚拟机又会出现与线上环境存在较大差异导致测试结果不准确。我们一般会有一台DEVNET的linux服务器与正式环境的部署和配置完全一样,组内的小伙伴们都会在上面进行上线前的测试验证。在这样的场景下是否也可以启用xdebug,让我们可以利用本机的IDE进行远程调试呢?

DEVNET中的linux环境一般是nginx+PHP5.3+FastCGI的组合。但是基本上都没有安装xdebug扩展。第一步我们就来安装xdebug扩展,由于使用php源代码在linux上编译安装失败率较高,在这里我就不介绍了,感兴趣的同学可以在网上搜。我推荐通过pecl方式安装扩展,这个php的命令行工具会自动下载对应版本的扩展代码,自动make。但是在DEVNET的linux环境中不能直接访问pecl.php.net,因此需要首先设置一下公司的代理服务器。 

 pecl config-set http_proxy http://<proxyhost>:<port>/ 
 配置完成后,就可以安装xdebug扩展 
 pecl install xdebug 

安装之后,在/usr/local/php/lib/php/extensions/XXXX/路径下可以找到xdebug.so,说明安装成功。进入/usr/local/php/etc修改php.ini,增加配置信息(具体路径可能存在差异,大家根据实际环境配置。) 

[xdebug]
zend_extension = "/usr/local/php/lib/php/extensions/XXXX/xdebug.so"
xdebug.remote_enable = On
xdebug.remote_handler = "dbgp"
xdebug.remote_host = "XXX.XXX.com"
xdebug.remote_port = 9009
xdebug.profiler_enable = off
xdebug.profiler_enable_trigger = off
xdebug.profiler_output_name = cachegrind.out.%t.%p
xdebug.profiler_output_dir = "/usr/local/php/var/xdebug_tmp"
接下来是是这段新加的配置生效,我一直以为重启nginx就会自动重新加载php.ini,结果发现是不正确的。因为linux环境下是使用php-fpm(即FastCGI)解析php动态脚本,所以需要单独操作php-fpm重新加载php.ini。试过了网上无数的方法都没有成功加载,大概的原因是php5.3的某个版本开始,php-fpm启动/重新加载/关闭需要通过signal控制来实现。最后我们内部部署的php目录中已经有封装好的shell脚本,直接使用之。执行 
 /usr/local/php/script/php-fpm.sh reload
 就会重新加载php.ini 

总结:使用任何编程语言进行开发都少不了debug调试,作为最关键最基本的程序员技能,我觉得在写代码之前必须将开发工具的debug配置好,否则只会让编码工作越来越不靠谱。希望这篇总结能够给刚刚涉足php开发的同学提供帮助。 

本站关键字:sunny90 web开发 数据库 移动开发 服务器 Nginx Mysql PHP
Copyright © sunny90版权所有 power by sunny90.com  
湘ICP备14012284号-1,粤公网安备 44030602000307号