Swoole 如何使用 Xdebug 進行單步除錯

沈唁發表於2020-11-10

在 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問答,轉載請註明出處。

Swoole官方公眾號

相關文章