乐趣区

关于php:Swoole-如何使用-Xdebug-进行单步调试

在 PHP-FPM 中应用 Xdebug 的人应该不少,而在 Swoole 中应用 Xdebug 的人还是很少的,起因是 Swoole 扩大明确阐明了和 Xdebug 扩大抵触

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

之前在 Swoole 文档中补充了 Sdebug 的装置,同样的 Sdebug 的 README 也进行了批改介绍如何装置,不过都是简略阐明如何胜利加载扩大,没有具体阐明配置

先说一下如何装置 Sdebug

为了防止 Swoole 的检测 Xdebug 正告,所以扩大注册的名称是 Sdebug

git clone git@github.com: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

编译实现后生成的 so 文件名还是 xdebug

查看是否加载胜利

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

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

2 是批改配置的 remote_port 端口

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

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

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 对象的中央

而后下一步下一步 …

start 之后咱们应用 telnet 进行连贯,发送一个音讯,断点就进入到 Connect 这里,而后咱们再下一步,终端才会输入Connect

紧接着咱们会到 var_dump 的中央,就能够看到 $data 的值是11111rn

而后来一个 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

也是能够断点调试的

框架的应用也是同理的,至于其余的什么和 docker 一起应用等等本人钻研吧 …

这里放一张调试 Hyperf 的截图

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

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

退出移动版