PHPStorm + Xdebug 断点调试

PHP程序的断点调试

作者 Fandy 日期 2016-11-10
PHPStorm + Xdebug 断点调试

PHP断点调试

追根溯源

由于PHP解释型语言的特性,之前编写PHP程序的时候,似乎只注重输出是否符合预期,程序的执行过程都不怎么在意。这样对程序执行过程中,所有变量的状态、执行的分支路径都无法完全掌控,可能会导致一些超出预期的异常情况。

调试方式

调试方案

PHP代码调试有两种方案:

  1. 输出和日志
  2. 断点

常规的调试代码,可以通过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
2
3
$ tar -zxvf xdebug-2.4.1.tgz
...
$ cd xdebug-2.4.1/

使用phpize生成编译文件

1
2
3
4
5
6
7
[root@localhost xdebug-2.4.1]# phpize 
Configuring for:
PHP Api Version: 20151012
Zend Module Api No: 20151012
Zend Extension Api No: 320151012
[root@localhost xdebug-2.4.1]# ./configure --enable-xdebug
...

执行编译,生成一个.so的扩展文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@localhost xdebug-2.4.1]# make && make install

Build complete.
Don't forget to run 'make test'.

Installing shared extensions: /usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20151012/

+----------------------------------------------------------------------+
| |
| INSTALLATION INSTRUCTIONS |
| ========================= |
| |
| See http://xdebug.org/install.php#configure-php for instructions |
| on how to enable Xdebug for PHP. |
| |
| Documentation is available online as well: |
| - A list of all settings: http://xdebug.org/docs-settings.php |
| - A list of all functions: http://xdebug.org/docs-functions.php |
| - Profiling instructions: http://xdebug.org/docs-profiling2.php |
| - Remote debugging: http://xdebug.org/docs-debugger.php |
| |
| |
| NOTE: Please disregard the message |
| You should add "extension=xdebug.so" to php.ini |
| that is emitted by the PECL installer. This does not work for |
| Xdebug. |
| |
+----------------------------------------------------------------------+

配置并校验

到这里就编译完成了,这个时候记住 Installing shared extensions 所标识的地址,打开php.ini文件,写入扩展地址:

1
2
3
4
5
6
7
8
[xdebug]
zend_extension=/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so
xdebug.remote_enable=1
xdebug.remote_host=192.168.61.8
xdebug.remote_port=9000
xdebug.idekey=phpstorm
xdebug.remote_autostart=1
xdebug.remote_mode=req

如果你找不到 php.ini 文件所在目录,可以执行如下指令:

1
2
3
4
5
$ php -i | grep ini

// 如下两行便是配置文件地址
Configuration File (php.ini) Path => /usr/local/webserver/php/lib
Loaded Configuration File => /usr/local/webserver/php/lib/php.ini

这个时候,保存php.ini文件之后,重启php-fpm即可生效,检查是否生效可以使用如下指令:

1
$ php -m

这个指令会列出所有PHP的模块,如果Zend Modules 里有Xdebug模块,说明已安装成功。

配置PHPStorm

远程同步

我现在的工作场景是,使用PHPStorm编写代码,使用一台远程linux服务器运行,这就需要将本地的代码和服务器保持同步,PHPStorm提供了一个非常方便的功能,Deployment,配置这个小工具可以使用ftp将本地代码快捷的同步到服务器,并且可以设置每次保存就自动同步到服务器。

设置方式是:选择Tools —> Deployment —> Configuration,进入远程服务器配置界面,点击左上角的“+”,填写服务器信息,和目录映射,如下图:

deployment

这里很重要的一点就是本地程序目录和服务器程序目录的映射,如果填写错误是无法正确同步的,配置好同步服务器之后,勾选Tools —> Deployment —> Automatic upload (always) ,这样每次保存就会自动同步到服务器了。

配置远程debug

要实现远程debug,需要Linux服务器上执行的程序主动发送一个远程调试请求到开发机器上,xdebug.remote_host这个配置指定的就是自己的开发机器,如果你的服务器已经配置好,那么运行程序的时候,PHPStorm就可以收到如下一条消息:

远程调试请求

选择Accept就会在本地创建一个远程调试配置,包含url、端口、入口文件等。

如果未收到如上的弹窗消息,请确认如下两条:

  1. 点击 Run —> start listening for PHP Debug Connections.
  2. 检查本地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

Xdebug settings

Xdebug 配置中文翻译

分享

这里分享一份PHPStrom破解程序,可以用这个构建一个自己的License Server.

再分享一份我使用的PHPStorm主题,主题欣赏一下

phpstorm主题