PHP 规范开发(一):断点调试

臻心依旧 2019-06-29

调试原理

参见:官方文档

调试流程

1  - Browser        使用 HTTP 向 Server 的 80 端口发送请求
2  - Nginx          监听到 80 端口的调试请求
3  - Nginx          将请求流转到 PHP
4  - PHP            将调试请求转发给 Xdebug
5  - Xdebug         向 Client 的 9000 端口响应请求(Xdebug 读取配置信息确定响应的端口)
6  - Phpsstorm      监听 9000 端口的响应(故 Client 监听端口要与 Xdebug 的配置一致)
7  - Phpsstorm      确认要断点调试到的位置,响应给 Xdebug
8  - Xdebug         通知 PHP 执行到断点位置
9  - PHP            将执行后的信息流转给 Nginx
10 - Nginx          将信息响应给 Browser
11 - Browser        显示执行结果

官方文档里的流程图
PHP 规范开发(一):断点调试

选择版本

手动选择

Xdebug下载页面

这里介绍 Windows 的 Xdebug 安装
source (SHA256: dae691d6c052073b886e0c6e1306a707bca9fd18a1e3485384ef6c4aacf1bd77)
Windows binaries:
PHP 7.0 VC14    (64 bit) (SHA256: a7b7ebcaaabb6840751c83411fb3e787d04be6e75e95df96b3ba88a581215b2d)
PHP 7.0 VC14    (32 bit) (SHA256: b108c1e09fce65fdeafa79687ba3ce4e08d7e6861cac6b90e5546d46ab250a45)
PHP 7.0 VC14 TS (64 bit) (SHA256: 4d61ffb7d4b8def2f1f8f9f08695048fc03844477719939f712f8ba53f646712)
PHP 7.0 VC14 TS (32 bit) (SHA256: 7812579264b3eae5668b05024997f7b7fce5d6abf00a3b019563c7f779697dff)
PHP 7.1 VC14    (64 bit) (SHA256: 8e4d46c322fab7a40362730647010f3cb52027a05bb70da3d1a3a08436c96a22)
PHP 7.1 VC14    (32 bit) (SHA256: d1c14fc4227166de4834db102677da875c039e50a197654d304d6a407bdcca4f)
PHP 7.1 VC14 TS (64 bit) (SHA256: b2adba0a07ae3d6038d25c50a85484b98bae95df3c533d5f2607484d91b12e03)
PHP 7.1 VC14 TS (32 bit) (SHA256: 8c0cfa8cb74695361f0230b1d6bef4bbba01c089c17efcb4d108d7beba7462e1)
PHP 7.2 VC15    (64 bit) (SHA256: d589baece219d3bc3963dcdd9fc475294767328b0d2552cec7e2363146870dae)
PHP 7.2 VC15    (32 bit) (SHA256: dd5872cf7bb5fabeb3c8c7e77a8bb2cef314705147a40decacd772c6f840b778)
PHP 7.2 VC15 TS (64 bit) (SHA256: ae18f7659f55e7bfcf42c782d1cfa11373524630c182de5b882f9e37e8791385)
PHP 7.2 VC15 TS (32 bit) (SHA256: ddedf1d0cea0e9fd36c49ba01c6afbea60d1299b3f86bba9cdf057b53ce2bee5)

根据 phpinfo 给出的信息选取 「32 bit 或 64 bit」 以及「TS 或 NTS」

System                     Linux centos7 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64
...
PHP Extension Build        API20160303,NTS

这里需要注意的是: Windows 环境下使用 PHPStudy 的系统版本都是 32 bit

System                     Windows NT SEA 10.0 build 16299 (Windows 10) i586  
...
Architecture               x86  
...
PHP Extension Build        API20151012,NTS,VC14
  • 添加 Xdebug 扩展

编辑 php.ini

[XDebug]

zend_extension = "D:\EXE\phpStudy\php\php-7.0.12-nts\ext\php_xdebug.dll"
  • Windows 本地下载 PHP 7.0 VC14 (32 bit)dll 文件放入对应版本 phpext 拓展文件夹内即可

自动选择

这里介绍 Linux 的 Xdebug 安装

在官方自动选择 Xdebug 界面输入 phpinfo() 输出的信息,会给出适合当前 php 的 Xdebug 版本

PHP 规范开发(一):断点调试

根据官方提示进行安装即可

[root@localhost ~]# wget http://pecl.php.net/get/xdebug-2.6.1.tgz
    [root@localhost ~]# tar -xvzf xdebug-2.6.1.tgz
    [root@localhost ~]# phpize
    [root@localhost ~]# ./configure --with-php-config=/usr/local/php/bin/php-config
    [root@localhost ~]# make && make install
    [root@localhost ~]# vim /usr/local/php/etc/php.ini

添加 Xdebug 拓展

# zend_extension = xdebug.so

配置设置

监听端口

  • 配置监听端口

PHP 规范开发(一):断点调试

端口冲突

针对的是: Windows

# 查看端口状态
netstat -ano

#查看指定端口状态
netstat -ano | findstr 9000

# TCP    127.0.0.1:9000         0.0.0.0:0              LISTENING       4144
# TCP    127.0.0.1:9000         0.0.0.0:0              LISTENING       5268
# TCP    127.0.0.1:9000         0.0.0.0:0              LISTENING       4300
# TCP    127.0.0.1:9000         0.0.0.0:0              LISTENING       5476

#找到进程号对应的进程名称
tasklist | findstr 4144

#根据进程名称终止进程
taskkill /f /t /im /php-cgi.exe

#也可以直接去任务管理器根据PID终止进程

配置说明

[xdebug]
zend_extension="D:\EXE\phpStudy\php\php-7.0.12-nts\ext\php_xdebug.dll"   # 引入Xdebug拓展
xdebug.auto_trace= On                                                    # 是否开启自动跟踪
xdebug.show_exception_trace= On                                          # 是否开启异常跟踪
xdebug.remote_autostart= On                                              # 是否开启远程调试自动启动
xdebug.remote_enable = On                                                # 是否开启远程调试
xdebug_remote_host = "127.0.0.1"                                         # 配置远程调试主机IP
xdebug.extended_info=On                                                  # 是否开启调试扩展信息
xdebug.profiler_enable = On                                              # 是否开启调试内容
xdebug.profiler_output_dir = "c:/wamp/tmp"                               # 调试输出路径
xdebug.remote_handler = dbgp                                             # 多人调试指定dbgp代理
xdebug.remote_port = 9001                                                # 远程调试的端口
xdebug.idekey = phpStorm                                                 # 多人调试模式在代理服务器标识IDE
xdebug.collect_vars= On                                                  # 是否收集变量
xdebug.collect_return= On                                                # 是否收集返回值
xdebug.collect_params= On                                                # 是否收集参数
xdebug.trace_output_dir="c:/wamp/tmp"                                    # 跟踪输出路径

断点调试

开启调试

  • 开启调试的两种方法
1. 开启监听调试请求的按钮,监听到具有「XDEBUG_SESSION」的变进入调试状态

2. 开启配置好的配置信息,监听符合配置设置要求的调试请求
  • 设置调试配置
1. [PHP Web Page]    :不需要设置「IDE Key」每次调试都会自动生成「XDEBUG_SESSION_STAR」及其的随机数值

2. [PHP Remote Debug]:配置了「IDE Key」调试时通过「IDE Key」来鉴定身份判断是否开启调试
  • 连接调试器

要开始调试,首先需要在服务器上激活调试器。

If you want to debug a script started through a web browser, simply add XDEBUG_SESSION_START=session_name as parameter to the URL. Instead of using a GET parameter, you can also set XDEBUG_SESSION_START as a POST parameter, or through a cookie named XDEBUG_SESSION.

连接调试器有多种方式:

1. 「GET」   方式:在「URL」后追加「 XDEBUG_SESSION_START = session_name」
 2. 「POST」  方式:在「POST」请求中添加「XDEBUG_SESSION_START = session_name」参数
 3. 「COOKIE」方式:将「XDEBUG_SESSION = session_name」设为「COOKIE」

 #   在开启用监听调试请求时连接调试器依据「XDEBUG_SESSION」是否存在,不关心其值

使用「Xdebug Helper」插件可以很方便地实现设置「COOKIE」方式连接调试器

PHP 规范开发(一):断点调试

与监听调试请求(Listening for PHP Debug Connections)不同,远程调试(PHP Remote Debug)要求「XDEBUG_SESSION」的值与配置远程调试(PHP Remote Debug)时设置的「IDE Key(session id)」一致

本地项目

即项目架设在本地,Xdebug 与 IDE 在同一个环境中

  • php.ini 文件中的 Xdebug 配置
[XDebug]
zend_extension        = "D:\EXE\phpStudy\php\php-7.0.12-nts\ext\php_xdebug.dll"
xdebug.remote_enable  = on
xdebug.remote_port    = 9001 
xdebug.remote_host    = 127.0.0.1
xdebug.remote_handler = dbgp
  • 在 PhpStorm 中配置服务器信息

PHP 规范开发(一):断点调试

远程项目

即项目部署在远程,Xdebug,PHP 在服务器上, IDE,Browser 在本地

  • 配置文件
[XDebug]
zend_extension        = xdebug.so
xdebug.remote_enable  = on
xdebug.remote_port    = 9001
xdebug.remote_host    = 192.168.1.4
xdebug.remote_handler = dbgp
配置要本地与远程的代码映射关系才能使本地打的断点正确地在远程执行

PHP 规范开发(一):断点调试

使用 Host: www.vmshop.com 才能让 Nginx 解析到正确的项目根路径.

多人调试

官方文档里的流程图:

PHP 规范开发(一):断点调试


代理协议

由于 Xdebug 的 xdebug.remote_host 限制了调试人数,下载 DBGp 代理实现多用户调试

  • 配置文件
[XDebug]
zend_extension        = xdebug.so
xdebug.remote_enable  = on
xdebug.remote_port    = 9002
xdebug.remote_host    = 127.0.0.1
  • 运行 DBGp 代理
[root@centos7 ~]# ./pydbgpproxy -i 0.0.0.0:9001 -d 9002

# INFO: dbgp.proxy: starting proxy listeners.  appid: 24399
# INFO: dbgp.proxy: dbgp listener on 127.0.0.1:9002
# INFO: dbgp.proxy: IDE listener on  0.0.0.0:9001

# INFO: dbgp.proxy: Server:onConnect ('192.168.108.1', 9572) [proxyinit -p 9001 -k jiong -m 1]

关于: ImportError: No module named dbgp.serverBase 的解决方法

  • 注册本机到 DBGp 代理服务

在 PhpStorm 的导航栏上找到 DBGp Proxy 进行 Register IDE 即可

# 注册成功或失败 IDE 的 Event Log 都会有相应的提示记录

1:15    Xdebug proxy: IDE successfully registered with ide key 'jiong'

1:19    Xdebug proxy: IDE Key already exists

动态地址

[XDebug]
zend_extension             = xdebug.so
xdebug.remote_enable       = on
xdebug.remote_port         = 9001
xdebug.remote_connect_back = 1
xdebug.remote_handler      = dbgp

配置好路径映射正确的「Servers」,开启监听调试即可

相关文章

PHP 规范开发(一):断点调试
PHP 规范开发(二):单元测试
PHP 规范开发(三):版本控制与协作开发
PHP 规范开发(四):重构、代码规范及设计模式

相关推荐