Swoole 如何使用 Xdebug 进行单步调试

在 PHP-FPM 中使用 Xdebug 的人应该不少,而在 Swoole 中使用 Xdebug 的人还是很少的,原因是 Swoole 扩展明确说明了和 Xdebug 扩展冲突

不过好在我们社区成员给力,提供了一个 Sdebug ,在此我们应该感谢 @mabu233 和 @huanghantao 进行了兼容,让 Xdebug 可用于 Swoole 环境进行断点、调试

之前在 Swoole 文档中补充了 Sdebug 的安装,同样的 Sdebug 的 README 也进行了修改介绍如何安装,不过都是简单说明如何成功加载扩展,没有详细说明配置

先说一下如何安装 Sdebug

git clone [email protected]:swoole/sdebug.git -b sdebug_2_9 --depth=1

cd sdebug

phpize

./configure

make clean

make

make install

步骤很简单,就是 clone 源码,进入目录然后编译

如果你的 PHP 是通用安装,没有修改默认位置等等,也可以直接运行目录下的脚本:

./rebuild.sh

如果你的 phpize 不是默认路径的话,请使用绝对路径;同样的 php-config 需要使用--with-php-config=加上你的绝对路径
编译成功后需要在 php.ini 加载扩展

zend_extension=xdebug.so

查看是否加载成功

php --ri sdebug

别走,还没完,还需要一些其他的配置,不然你去断点会发现不起作用
我们还需要在 php.ini 中加入这几个配置项

xdebug.remote_enable=1

xdebug.remote_autostart=1

xdebug.remote_host=localhost

xdebug.remote_port=8000

xdebug.idekey="xdebug"

一个配置难倒英雄汉,很多人在使用 Sdebug 的时候就会遇到需要这样问题,不起作用,就吐槽不好用,实际上是你的姿势不对,配置项没加或者加错了

需要配合 PhpStorm 的话,还需要设置一下 PhpStorm 的配置

Preferences | Languages & Frameworks | PHP | Debug

Swoole 如何使用 Xdebug 进行单步调试

1 是为了我们不加断点的时候,自动给第一行断点

2 是修改配置的remote_port端口

Preferences | Languages & Frameworks | PHP | Servers
添加一个服务

Swoole 如何使用 Xdebug 进行单步调试

紧接着在右上角这里添加一个调试,选择 PHP Remote Debug

Swoole 如何使用 Xdebug 进行单步调试

server 选择我们刚才创建的 server,IDE key 就填我们 php.ini 中配置的xdebug

然后我们来试验一波,看看好不好使

先来一个简单的 TCP Server

//创建Server对象,监听 127.0.0.1:9501 端口

$server = new SwooleServer('127.0.0.1', 9501);

//监听连接进入事件

$server->on('Connect', function ($server, $fd) {

echo "Client: Connect.n";});

//监听数据接收事件

$server->on('Receive', function ($server, $fd, $from_id, $data) {

var_dump($data);

$server->send($fd, "Server: " . $data);

});

//监听连接关闭事件

$server->on('Close', function ($server, $fd) {

echo "Client: Close.n";});

//启动服务器

$server->start();

点击右上角的绿色虫子进入 Debug 状态,启动我们的服务,会发现自动断在了第 4 行创建 Server 对象的地方

Swoole 如何使用 Xdebug 进行单步调试

然后下一步下一步...

start 之后我们使用 telnet 进行连接,发送一个消息,断点就进入到 Connect 这里,然后我们再下一步,终端才会输出Connect

紧接着我们会到 var_dump 的地方,就可以看到 $data 的值是11111rn

Swoole 如何使用 Xdebug 进行单步调试

然后来一个 HTTP Server

$http = new SwooleHttpServer('0.0.0.0', 9501);

$http->on('request', function ($request, $response) {

var_dump($request->server);

$response->header("Content-Type", "text/html; charset=utf-8");

$response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>");

});

$http->start();

这里需要在访问时加上一个XDEBUG_SESSION_START参数或者在 Cookie 中添加也可以

浏览器访问http://127.0.0.1:9501/?XDEBUG_SESSION_START=xdebug

也是可以断点调试的

Swoole 如何使用 Xdebug 进行单步调试

框架的使用也是同理的,至于其他的什么和 docker 一起使用等等自己研究吧...

这里放一张调试 Hyperf 的截图

Swoole 如何使用 Xdebug 进行单步调试

还有一个 Tips,把右上角的电话图标选择为上图那样,会在命令行启动服务时自动调起 Debug 服务

原文发布于Swoole问答,转载请注明出处。

Swoole 如何使用 Xdebug 进行单步调试

以上是 Swoole 如何使用 Xdebug 进行单步调试 的全部内容, 来源链接: utcz.com/a/65615.html

回到顶部