PHP断点调试
追根溯源
由于PHP解释型语言的特性,之前编写PHP程序的时候,似乎只注重输出是否符合预期,程序的执行过程都不怎么在意。这样对程序执行过程中,所有变量的状态、执行的分支路径都无法完全掌控,可能会导致一些超出预期的异常情况。
调试方式
调试方案
PHP代码调试有两种方案:
- 输出和日志
- 断点
常规的调试代码,可以通过echo、var_dump、print_r等直接输出就可以,不便于输出的应用程序可以将变量写入日志文件。而遇到复杂的逻辑和大型的应用程序,一个一个得输出就会显得力不从心,这个时候能够断点调试可以极大的节省时间和工作量,并且能够更加精确的了解程序的执行过程。
当PHP程序作为接口提供服务的时候,每次去手动构造参数调试,非常麻烦,而利用IDE直接在接口程序里打上一个断点,让接口正常接收请求,便可以毫不费力的调试起来,简直不要太爽。
接口调试
不巧我现在使用的项目便是PHP程序作为一个DataSvr提供数据和业务逻辑处理,数据的输入和输出都是二进制,并且限制在8080端口,这就给调试程序带来很大麻烦,我们现有的解决方案就是使用PHP编写一个web页面(Unit工具),将参数打包成二进制,通过curl发起请求到8080端口从而执行调试,这个已经足以解决开发时的需求了。但是在实际项目运行过程中,8080端口是被动接收请求进来,这个时候想要调试只能通过写入日志的方式,或者是切换到Unit工具构造请求参数,来执行调试,这中间不免曲折无数。
远程调试
Xdebug有一个最重要的「远程调试」特性 —— 如果你在本地开发,并在虚拟机或者其他服务器上测试,这恰恰切中了我的痛点。PHP有Xdebug这等调试神器,为什么不配置一个能够支持断点调试的环境呢?
配置Xdebug
关于Xdebug
Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况。
配置之前,先说明我所使用的环境和工具如下:
名称 | 版本 |
---|---|
PHP | 7.0.9 |
PHPStorm | 2016.2.2 |
Xdebug | 2.4.1 |
PHP服务器是安装在centos6.5系统上,所以首先去下载 Xdebug 源码,如果你使用的是PHP7,必须选择2.4.0以上的版本。TS和NTS关于这个的描述是:
TS:Thread Safe 线程安全, 执行时会进行线程(Thread)安全检查
NTS:Non Thread Safe 非线程安全, 在执行时不进行线程(Thread)安全检查
一般在IIS以ISAPI方式加载的时候选择TS版本。其他情况下都使用NTS,因为这个版本性能更好。
安装Xdebug
下载源码之后,解压并且cd到源码目录
1 | tar -zxvf xdebug-2.4.1.tgz |
使用phpize生成编译文件
1 | [root@localhost xdebug-2.4.1]# phpize |
执行编译,生成一个.so的扩展文件
1 | [root@localhost xdebug-2.4.1]# make && make install |
配置并校验
到这里就编译完成了,这个时候记住 Installing shared extensions 所标识的地址,打开php.ini文件,写入扩展地址:
1 | [xdebug] |
如果你找不到 php.ini 文件所在目录,可以执行如下指令:
1 | php -i | grep ini |
这个时候,保存php.ini文件之后,重启php-fpm即可生效,检查是否生效可以使用如下指令:
1 | php -m |
这个指令会列出所有PHP的模块,如果Zend Modules 里有Xdebug模块,说明已安装成功。
配置PHPStorm
远程同步
我现在的工作场景是,使用PHPStorm编写代码,使用一台远程linux服务器运行,这就需要将本地的代码和服务器保持同步,PHPStorm提供了一个非常方便的功能,Deployment,配置这个小工具可以使用ftp将本地代码快捷的同步到服务器,并且可以设置每次保存就自动同步到服务器。
设置方式是:选择Tools —> Deployment —> Configuration,进入远程服务器配置界面,点击左上角的“+”,填写服务器信息,和目录映射,如下图:
这里很重要的一点就是本地程序目录和服务器程序目录的映射,如果填写错误是无法正确同步的,配置好同步服务器之后,勾选Tools —> Deployment —> Automatic upload (always) ,这样每次保存就会自动同步到服务器了。
配置远程debug
要实现远程debug,需要Linux服务器上执行的程序主动发送一个远程调试请求到开发机器上,xdebug.remote_host
这个配置指定的就是自己的开发机器,如果你的服务器已经配置好,那么运行程序的时候,PHPStorm就可以收到如下一条消息:
选择Accept就会在本地创建一个远程调试配置,包含url、端口、入口文件等。
如果未收到如上的弹窗消息,请确认如下两条:
- 点击 Run —> start listening for PHP Debug Connections.
- 检查本地9000端口是否有被占用,如果被占用请配置 Preferences —> PHP —> Debug 修改Xdebug的端口号,同步修改远程服务器上的xdebug.remote_port.
如果你想自定义调试配置信息,可以选择Run —> Edit Configurations ,可以进入远程调试配置界面
选择左上角的+号可以添加调试类型:
- 常规的url请求调试,请选择 PHP Web Application
- 调试post请求的接口,请选择PHP HTTP Request
- 调试命令行程序,请选择PHP Script
调试服务器的配置如下:
这里配置访问程序所用的URL,端口,使用的调试插件,以及勾选Use path mappings,这个选项是断点调试的关键,必须保证本地程序和服务器程序是一对一映射的关系,才能准确断点。
调试程序
以上配置准备完善之后,首先确保 Listening for PHP Debug Connections 是打开状态,这个在工具栏中是一个电话的标识,然后在要断点调试的程序前面打上一个断点,运行程序,程序即可在编辑器中挂起,等待下一步指令。
参考链接
Run/Debug Configuration: PHP HTTP Request
Debugging PHP CLI scripts with PHPStorm
分享
这里分享一份PHPStrom破解程序,可以用这个构建一个自己的License Server.
再分享一份我使用的PHPStorm主题,主题欣赏一下