成為高階 PHP 程式設計師的第一步——除錯(xdebug 原理篇)

Newiep發表於2017-03-09

文章參考:Xdebug工作原理
xdebug 對於許多 phper 應該一點也不陌生。說來慚愧,對於常年使用 var_dumpecho,現在又多了一個dd :sweat_smile: ,來除錯程式的猿來說,這種方式實在有點過時。今天花了一些時間好好了解了一下,現在就整理一下這款,能提升你除錯效率以及逼格滿滿的除錯利器———— xdebug

先講一下 xdebug 工作原理,總結為下面幾個步驟:

  1. IDE(比如 PhpStorm ,下文所述的客戶端)中已經整合了一個遵循 BGDp 的 Xdebug 外掛。當要 debug 的時候,點選一些 IDE 的某個按鈕,啟動這個外掛。該外掛會啟動一個 9000 的埠監聽遠端伺服器發過來的 debug 資訊。

    phpstorm 中,開啟 / 關閉的位置為:工具欄 > Run > Start / Stop Listening for PHP Xdebug Connetions

  2. 瀏覽器向 Httpd 伺服器傳送一個帶有 XDEBUG_SESSION_START 引數的請求,伺服器收到這個請求之後交給後端的PHP(已開啟 xdebug 模組)進行處理。

  3. Php 看到這個請求是帶了 XDEBUG_SESSION_START 引數,就告訴 Xdebug,“嘿,我要debug喔,你準備一下”。這時,Xdebug 會向來源 ip 客戶端的9000埠(預設是 9000 埠)傳送一個debug請求,然後客戶端的 9000 埠響應這個請求,那麼 debug 就開始了。

    這裡通知客戶端其實有兩種方式,根據 xdebug 的配置 xdebug.remote_connect_back = 0 | 1 使用不同的通知方式,下文會詳細介紹

  4. Php 知道 Xdebug 已經準備好了,那麼就開始開始一行一行的執行程式碼,但是每執行一行都會讓 Xdebug 過濾一下,Xdebug 在過濾每一行程式碼的時候,都會暫停程式碼的執行,然後向客戶端的 9000 埠傳送該行程式碼的執行情況,等待客戶端的決策(是一句程式碼還是下一個斷點待)。。
  5. 相應,客戶端(IDE)收到 Xdebug 傳送過來的執行情況,就可以把這些資訊展示給開發者看了,包括一些變數的值等。同時向 Xdebug 傳送下一步應該什麼。

以上就是整個工作流程,下面介紹一下兩種通知客戶端的方式:

Xdebug 的官方文件給了兩張很清楚的互動圖

第一種,靜態繫結客戶端 host

xdebug.remote_connect_back = 0 ,也是 xdebug 的預設方式,這種情況下,xdebug 在收到除錯通知時會讀取配置 xdebug.remote_hostxdebug.remote_port ,預設是 localhost:9000,然後向這個埠傳送通知
file

可以看到,remote_host 的 IP 是固定的,這種方式只適合單一客戶端開發除錯

第二種,不繫結 IP,根據請求來源通知

xdebug.remote_connect_back = 1,這種方式和上面基本相同,唯一不同的是,php 在 接受 http 請求後,xdebug 會將請求來源的 IP 繫結,並通知

file

以上就是所有 xdebug 工作原理相關的介紹,下一篇講在 homestead + phpstorm 作為開發環境如何具體配置並使用 xdebug

相關文章