Xdebug 遠程調試,你會用嗎?

前言

在開發過程當中,咱們最少不了的就是調試,由於 php 不能像 Java 和 C# 那樣與生俱來的優點,擁有開箱即用的斷點調試,不少時候咱們的開發者都是使用的 var_dump 方法來對結果進行輸出,而有的時候須要查看調用棧時,有的開發者甚至都不知道如和下手。(能夠 throw 異常 或者 使用 debug_print_backtracedebug_backtrace 來打印調用棧),雖然不少開發者知道xdebug 可是也會由於其繁瑣的安裝望而卻步,又或許你在本地高高興興搭建好了,有時候要調試一下外網的,好比測試服務器,你會發現這是個坑,不少文章都沒有正確的引導你去如何的安裝它。php

服務器如何安裝 Xdebug

環境準備

  • ubuntu 16.04
  • php 7+
  • XShell

首先打開 Xdebug 官網nginx

是否是看到碩大的 Download 連接吸引到了你,若是你知道你的 php 是什麼版本 你能夠在這裏愉快的下載,而後並安裝。git

偶,我湊,怎麼全是 Windows 的,Linux 的呢?Linux 固然是要從源碼構建啦。web

我湊,不會?不要緊我們一塊兒來學一學,首先新建一個 php 文件,若是你是用包管理器安裝的那麼請直接跳轉到包管理器chrome

// info.php
<?php
phpinfo();

而後放到你的 web 目錄,看清楚,必定是 web 目錄。不要以爲你耍小聰明,使用 php -S 來啓動一個臨時的 web 服務器,不容許,由於你這樣用到的 php.inicli 的,而不是 fpm 的,當 phpinfo 信息顯示出來。shell

而後咱們回到官網,點擊下載頁面的 custom installation instructions.ubuntu

來到這個頁面後看到一個輸入框,可是什麼意思呢?vim

duang,翻譯一下。服務器

這一下明白了吧,就是把 phpinfo 的完整輸出複製到這個框框裏面,而後提交,這下咱們回到 phpinfo 頁面, Ctrl + A , Ctrl + C ,一鼓作氣,過來粘貼提交。cookie

是的,沒錯,每一步該幹什麼它全都告訴你了,你只須要根據上面提供的 Ctrl+Insert(複製) ,Shift + Insert (粘貼),執行就完事兒。

第 9 步 直接用 vim 打開 php.ini 在最後加入那一行便可。

如今 ,在命令行執行

php -m

看到最後面有 XDebug ,彆着急,這才成功了一半。
固然,到這裏我還要告訴你一個很差的消息,哈哈。
若是你的 php 不是手動編譯的,而是經過 包管理器(apt),由於 ubuntu 16.04默認的安裝源 安裝的是7.0 ,沒有更高級的版本,你須要用 PPA 源來下載最新的 php 。固然,這裏咱們就不在討論了。

包管理器

若是你是使用的 apt 或者 apt-get 安裝的,那麼你能夠經過 apt search xdebug 命令來查找 apt 中有關 xdebug 的包。

你可能會看到這個東西,沒錯,直接複製名字執行。

apt install php-xdebug

而後這時候,你去執行 php -m 就會發現 Xdebug 已經安裝好了。

寶塔面板

若是你是寶塔面板的用戶,你能夠在面板的軟件管理,對你須要操做的php版本中能夠找到有直接安裝 xdebug 擴展的位置。

接下來

無論你是包管理器 仍是 手動編譯 安裝的,這裏的內容都須要看了。

打開 fpm 的 php.ini ,若是你是 寶塔面板 用戶,你能夠在寶塔的在線編輯,也能夠根據 phpinfo 中的 路徑直接編輯, 在 php.ini 最後面加入。

; 這個是節點名字 無所謂大小寫
[XDebug]
; 容許遠程 能夠爲 On 或者 1 都表示啓用 , Off 和 0 表示關閉關閉
xdebug.remote_enable = 1
; 遠程主機的 IP 這裏咱們填寫,固定的 127.0.0.1 
xdebug.remote_host = 127.0.0.1
; 調試鏈接端口 請記住這個端口,後續會用到。此配置項默認值爲 9000 ,可是一般 9000 端口被 fpm 佔據 ,故更換端口。
; 另外,請在你服務器的控制面板和服務器防火牆中開放這個端口的進出站。
; 若是你是寶塔面板用戶 請放行此端口。
xdebug.remote_port = 19000
; 接下來的值都是可選的,可是我推薦你使用
; 鏈接 IDE 的 Key,請記住他,能夠本身自定義,主要用來過濾請求。
xdebug.idekey=PHPSTORM
; 這個表示擴展的位置,若是你是編譯安裝的,那麼這個值你應該在第九步已經設置好了,若是你是 使用 包管理器安裝的,那麼這個值應該是自動設置的,並且你不會在這個 php.ini 中找到他,可是此時你已經不用設置它了。
; 若是你是寶塔的用戶,你會發如今你編輯這個文件以前,寶塔已經幫你設置好了
; 另外,一般我建議你將路徑使用引號包裹起來,由於當路徑中有特殊字符或者空格時會出現問題

; zend_extension=php_xdebug.dll

好了,保存完成後,咱們須要重啓 fpm

service php7.0-fpm restart

由於個人 php 版本是 7.0 因此上面的命令是這樣,若是你的不是,請根據實際狀況來定。
若是你是寶塔面板的用戶,請直接在面板操做。
若是你是本身編譯的改了服務名字,不記得了,請執行

service --status-all

這將會打印出全部的服務(有可能會很慢),你能夠在其中慢慢找。

當你準備好了以後,咱們回到咱們的開發端,打開 PHP Storm

客戶端

使用 PHP Storm 打開你的項目。

看到右上角的調試面板,而後選擇這個按鈕,而後進去添加。

請根據圖片提示

emm,過濾請求那個框一時找不到,就描述一下吧,當咱們有開啓多個 PHP Storm 窗口時,若是有一個以上的 窗口都啓用的 Xdebug ,那麼,IDE 此時將會不知道該調用哪個而發生矛盾,你能夠在彈出的窗口中選擇使用哪個項目。

還有,當你經過 APP 請求時,你可能也不須要去過濾,故也不須要去勾選它,使用更加寬鬆的調試。

剛剛圖上既然說到的了 mappings ,可是我通常都不會去啓用它,但願你也用不到。

不知道呢是否還記得,剛剛在修改 php.ini 時,我讓你記住的那個 IDE Key,如今你能夠用到它了。

接下來,咱們還要去修改另一個 配置,本地的調試端口。

按下 Ctrl+Alt+S 打開設置界面,或者在 左上角 File > Settings 而且定位到

Languages & Frameworks > PHP > Debug

當你設置好這個端口後,請記住它,接下來就會用到。

偶,好像最後一個標註錯誤,最後一個是,當在項目外時,在第一行斷點。

這個纔是在首行進行斷點。

設置到這裏,你是否是以爲應該OK了?固然,不是,是否記得剛剛在 準備工具 中提到的 Xshell 和 在 php.ini 中設置的 端口沒有使用。

Xshell 設置

請確保在你的 Xshell 左側的 會話管理器 中已經添加了你的服務器鏈接。

圖片中雖然已經對大部份內容進行了模糊處理,畢竟是外網服務器,若有遺漏之處,也請不要對其進行惡意請求,謝謝。

點開屬性,依次選擇 鏈接 >SSH>隧道 > 添加

請參考圖片進行操做

若是隧道轉發沒有成功該怎麼辦?

  • 查看本地端口的使用是否正確。

打開命令行,執行以下命令,其中 9001 是在 PHP Storm 中設置的端口。

# 找到 PID
netstat -aon | findstr 9001
# 經過 PID 找到 是誰在使用。
tasklist | findstr {PID}
# 結束進程 若是這端口被佔用 可使用以下命令結束,固然,我更加推薦你換個端口。
taskkill /PID {PID}

若是本地正常,那麼問題就應該在服務器。

在服務端執行以下命令,19000 爲 服務器設置的端口。

lsof -i:19000

此時,若是隧道未鏈接,那麼這個端口是不該該被佔用的,反之則顯示爲一個 SSHD,若是不爲空,那麼就是端口被其餘程序佔用了,我建議你換個端口。

最後一線

當以上步驟都完成後,咱們就能夠來進行測試了嗎?不是的,還有一步,代碼同步 ,這是很是重要的一步。

代碼同步

顧名思義,代碼同步,須要你本地的代碼和線上的代碼一致。爲了在調試時追蹤跳轉文件,避免因文件沒法映射而致使沒法同步。

通常狀況下,咱們都是使用 git 來進行代碼託管,直接從 git 上拉取代碼便可,這樣就能確保咱們的代碼是同步的,如今咱們就能夠 happy 的進行調試代碼了,可是當你直接訪問你卻發現,IDE 並無攔截你的請求,是否是很尷尬。

啓用調試

如圖上所說,其實這種狀況下咱們也能夠正常進行調試。

當咱們直接訪問,卻發現 PHP Storm 並無捕獲到咱們的請求這是爲何?

緣由很簡單,咱們沒有告訴 Xdebug 咱們要關心這個請求,不然試想一下,有幾我的同時請求你的網頁,所有被 IDE 接收了,是否是瘋了?

這時候,咱們只須要在 URL 後面加上 XDEBUG_SESSION_START=233 首先 ,這個 XDEBUG_SESSION_START 是必須的,可是他的值是能夠隨便填寫的。
此時 URL 變成了,參考文檔

https://xxx.com?XDEBUG_SESSION_START=233

就能夠正常捕獲了。

若是你以爲手動添加,很麻煩,那你還能夠安裝一個 Chrome 插件。

Xdebug helper - Chrome 網上應用店

這個工具會自動幫你設置,只不過他是在 cookie 裏面設置,依賴cookie。

安裝完成後,須要先配置,右鍵擴展欄的蟲子圖標,選擇選項

選擇 PHP Storm, 固然,別忘了旁邊的 Save

常見問題

沒法斷點

  • 確認服務器端口在隧道連通後,是 SSHD 在使用那一個端口。
  • 確認服務器端口在防火牆以及服務器面板放行了端口。
  • 確認本地端口是被 phpstorm 所使用的。
  • 確認 XShell 隧道鏈接是成功狀態。
  • 確認 PHP Storm 中的 電話 圖標是綠色,而且正確配置了調試服務器。

本地沒法跳轉

這個主要是表如今 使用追蹤時,忽然就跳出了循環,明明下面還有斷點,這是由於一些項目中使用了 自定義一些複雜的表達式來引入文件,致使無法映射致使,好比 微擎 。這時候就須要單步驟調試,到出錯的位置,Xdebug 的 Debugger 窗格會爲咱們提示。

手動添加映射

clipboard.png

也能夠直接在上級目錄,爲整個目錄添加映射。

映射添加完成後,就能夠以繼續調試了

可是要注意路徑對應不然會影響調試。

調試自動斷開 nginx 返回 504

這是由於你沒有調整 PHP 和 FPM 以及 Nginx 的最大執行時間,修改到一個較大的值便可。

寶塔面板問題

寶塔面板的用戶你會發現你網頁端使用的 php 版本和 cli 的版本不一致,能夠打開

網站 > PHP 命令行版本(就在添加網站那一排的最後一個按鈕)

而後再進入

軟件商店 > 對應的 php 版本 > 設置 > 安裝擴展 > 選擇 Xdebug

順便還能夠把超時這些也在這裏修改了 解決上面的 504 問題

當安裝完 Xdebug 後,切換到 服務 而後選擇 「重啓」 必定是 重啓 而不是 重載配置

而後點擊下面的 > phpinfo > 查看 phpinfo 。這時候你就能看到了,而後能夠搜索 xdebug 驗證是否安裝成功。

接着 去修改 php.ini ,配置咱們方纔 提到的

注意

  • 不能用於 Swoole
  • 不能用於 Workerman
  • 理論上相似框架都不能,不過實踐出真理
  • 理論上只能同時一臺物理機對應一臺服務器進行調試,由於 xshell 隧道佔用。固然 你能夠多啓動 fpm 使用不一樣的 php.ini 文件(理論可行)。

使用 Xdebug

圖例:

  • 一、Debug 窗口 在啓動 debug 時 該窗口會自動打開
  • 二、跳轉到下一個斷點
  • 三、暫停執行
  • 四、結束腳本執行
  • 五、查看全部斷點
  • 六、屏蔽全部斷點
  • 七、逐行執行代碼
  • 八、進入方法或文件
  • 九、強制進入方法或文件
  • 十、跳出方法或文件
  • 10和11中間 ,運行到光標所在行,若是期間有斷點會優先執行斷點
  • 十一、執行表達式
  • 十二、Debugger 窗體,能夠查看執行的調用棧,查看/修改運行時環境,變量。
  • 1三、Console 窗體,能夠執行命令
  • 1四、腳本結果窗體

這些都是有快捷鍵的,能夠把鼠標放上去看,能夠參考官方手冊

結束

曾經由於在遠程調試走了不少彎路,至此就專門去研究這個,通過屢次的實踐和應用,穩定了次方案進行安裝,故發出來,也但願對你有所幫助。

當你習慣了使用 Xdebug 調試,或許你之後都再也不想用 var_dump 了。

參考資料

相關文章
相關標籤/搜索