正如任何一個開發者可以證明的那樣,程式碼在初稿之後永遠不可能為生產做好準備。開發過程中的一個關鍵部分是除錯–刪除或改變程式碼中所有不工作的部分。
PHP的Xdebug擴充套件是一種流行的方法,可以根除並摧毀你程式碼中的所有bug。
Xdebug的一個偉大方面是它的靈活性。無論你喜歡哪種框架或開發環境,你都能找到適合你工作流程的Xdebug版本。從這裡開始,掌握這個工具不會花很長時間。
本教程將深入研究Xdebug,包括安裝過程、將其整合到你的設定中,以及一般使用方法。
首先,讓我們給你更多關於Xdebug是什麼和它做什麼的背景。
Xdebug介紹
Xdebug是最流行的除錯PHP程式碼的擴充套件之一。你將在你選擇的環境中安裝它,它充當一個 “步驟偵錯程式”。
Xdebug的核心是步進式偵錯程式,它與整合開發環境緊密結合,可以非常簡單地在PHP程式碼中設定斷點,以深入瞭解程式碼在執行時的情況。
Xdebug是一個PHP擴充套件,必須和PHP一起安裝和編譯。幸運的是,很多本地開發工具使安裝和執行Xdebug變得簡單。
Xdebug logo
簡而言之,這使你能夠逐行處理你的程式碼,這樣你就可以逐步檢視程式碼在你的程式中是如何行動和互動的,以及調查其輸出。從那裡,你可以根據你的需要進行修改。
不過,Xdebug可以做得更多。
- 你可以使用一套指標和視覺化的方法來分析你的程式碼的效能。
- 當你執行PHP單元測試時,你可以看到你執行和執行的程式碼套件。
- Xdebug包括 “跟蹤 “功能,它將把每個函式的呼叫寫到磁碟上。這將包括引數、變數賦值和返回值。
- Xdebug還對標準的PHP錯誤報告做了改進。我們將在後面介紹更多這方面的內容。
鑑於這些特性,有很多方法可以在你的工作流程中使用Xdebug(以及任何類似的偵錯程式)。我們將在下一節中介紹這些。
為什麼要使用Xdebug?
許多開發者不會有一個專門的除錯工作流程,使用第三方工具和擴充套件。這是因為 PHP 包含了它自己的基本錯誤記錄。你會使用as error_log
, var_dump
和print
等命令來檢視變數和函式呼叫的結果。
例如,有很多片段你可以重新用於WordPress的開發–Stack Overflow上有很多這樣的片段。
function log_me($message) { if ( WP_DEBUG === true ) { if ( is_array($message) || is_object($message) ) { error_log( print_r($message, true) ); } else { error_log( $message ); } } }
然而,這種方法也有一些重要的缺點。
- 你首先必須確保你為你所使用的平臺啟用錯誤日誌。在這種情況下,你要啟用
WP_DEBUG
(稍後會有更多介紹)。 - 這個 “轉儲 “除錯的例子比步驟除錯提供的調查範圍要小。在這裡,你只能輸出你定義的東西。
後一點需要很多手工操作,尤其是當你的日常工作不是系統管理員的時候。例如,如果你想除錯一個程式碼塊,你可能會根據你定義的一個變數來新增你的程式碼段。然而,它可能不是問題的根源,甚至不能說明正在發生什麼。
相反,像Xdebug這樣的工具可以發揮其魔力,提供更大的範圍。
- 你可以在執行過程中的不同點 “破壞 “你的程式碼,以檢視實時發生的情況。
- 有無數的指標、視覺化、分支等等來幫助你確定你的程式碼在做什麼以及它是如何反應的。
- 有時,你甚至可以在除錯過程中即時改變數值。這提供了巨大的價值,甚至對於工作良好的程式碼套件也是如此。你基本上可以在任何時候進行手動單元測試。
- 因為你使用斷點來標記要除錯的區域,所以你不需要在你的程式碼中使用片段工作。這可以使你的程式碼更乾淨,並減少未來問題的數量。
總的來說,使用像Xdebug這樣的工具是一個主動的決定,而不是一個被動的決定。你可以把步驟除錯作為核心開發過程的一部分,就像實施單元測試作為測試驅動開發(TDD)的一部分。
如何開啟PHP錯誤日誌
雖然你可以在沒有具體錯誤的情況下除錯你的程式碼,但在沒有開啟Xdebug的情況下知道問題是否發生往往是很好的。這給你一個探索的起點。這不是嚴格意義上的必要條件,但可以成為你的鏈條中的一個有用部分。
要報告每一個出現的錯誤,你需要在相關的PHP檔案的頂部新增一行。
error_reporting(E_ALL);
這是一個包羅永珍的命令,你可以用ini_set函式實現同樣的目的。
ini_set('error_reporting', E_ALL);
這讓你可以逐個專案地改變php.ini檔案中的設定。雖然你可以進入這個檔案並進行手動更改,但通常使用 ini_set
來更改特定的引數是一個更好的主意:
ini_set('display_errors', '1');
一旦你把主動錯誤報告設定成你喜歡的樣子,你就可以開始用Xdebug工作。
如何使用Xdebug
在接下來的幾個部分,我們將向你展示如何使用Xdebug,包括你需要設定的步驟。雖然我們不能涵蓋每個工具的各個方面,但這個快速入門指南會讓你快速入門。
不過,首先,你需要安裝Xdebug。讓我們來看看如何做到這一點。
1. 為你的作業系統(OS)安裝Xdebug
因為Xdebug可以適應任何數量的設定,所以每個設定的具體過程都會略有不同。在作業系統層面上,有一些區別。
- Windows:這是一個有點複雜的設定過程,包括使用現有的 PHP 檔案和安裝嚮導,然後下載適合你的系統的版本。
- Linux:這裡的方法可以說是最直接的了。你可以使用包管理器來安裝Xdebug,或者PHP擴充套件社羣庫(PECL)。
- Mac:這個方法也很簡單。一旦你安裝了PECL,你可以在終端例項中執行
pecl install xdebug
。你還需要在你的系統上安裝XCode命令列工具和PHP。
然而,大多數使用者不會想堅持使用系統級的Xdebug例項。相反,你會想把它整合到你自己的開發環境中。
2. 將Xdebug整合到你的開發環境中
一旦你為你的作業系統安裝了Xdebug,你應該把它連線到你的環境中。
這裡有很多支援的系統和工具,我們無法一一介紹。稍後,我們將為你提供PhpStorm的說明。即便如此,還有很多其他流行的環境可以選擇。下面是我們的一些頂級推薦。
Variing Vagrant Vagrants(VVV)
VVV是Make WordPress網站上的命名環境之一。
Varying Vagrant Vagrants標誌
好訊息是,VVV已經包括了Xdebug的一個版本,但你需要啟用它。你可以在一個終端視窗中使用安全殼(SSH)來完成這個任務。
vagrant ssh -c "switch_php_debugmod xdebug"
不過,這對效能有一點影響,如果你提供你的網站,你將需要把這個選項重新開啟。
Laravel Valet
對於一些使用者來說, Laravel的Valet代表了一個近乎完美的網路開發環境. 更棒的是, 你可以將Xdebug與之整合.
要做到這一點, 你需要為偵錯程式建立一個配置檔案. 你可以在命令列中使用 php --ini
找到你自己的路徑, 這將返回一些不同的檔案路徑:
終端機顯示配置檔案的路徑列表
接下來,在其他.ini檔案的路徑上建立一個新的xdebug.ini檔案。在我們的例子中,它位於/opt/homebrew/etc/php/7.4/conf.d。
一旦你開啟這個新檔案,也要開啟載入的配置檔案(你的主php.ini檔案)的路徑。兩者都開啟後,在底部新增以下內容。
- php.ini:
zend_extension="xdebug.so"
- xdebug.ini:
xdebug.mode=debug
一旦你儲存了你的改動,從終端執行 valet restart
,然後在你的網站的一個檔案中加入 phpinfo(); exit;
。你想通過在瀏覽器中快速載入頁面來檢查這是否有效。
PHP資訊介面
注意你可能需要用 sudo brew services restart php
來重啟PHP,同時用 php --info | grep xdebug
來檢查你的系統安裝Xdebug是否正確。你會注意到輸出中的Xdebug專用行:
從這裡,你可以尋求將Xdebug納入你選擇的編碼編輯器中。
XAMPP
與Valet一樣,XAMPP的過程也有幾個部分。然而,Windows和macOS版本有兩個不同的過程。
首先安裝XAMPP,然後快速檢查你的系統中是否存在php_xdebug.dll檔案(Windows)或xdebug.so檔案(macOS)。
顯示XAMPP檔案測試的終端視窗
如果該檔案存在,就可以繼續配置了。否則,首先需要下載適合Windows的二進位制檔案–為你喜歡的PHP版本下載一個64位的檔案–或者如果你用的是Mac,則需要安裝更多的依賴項。
對於 Windows,重新命名 DLL 檔案 php_xdebug.dll,然後把它移到 \xampp\php\ext 檔案路徑中。接下來,在你喜歡的程式碼編輯器中開啟\xampp\php\php.ini檔案並新增以下內容:
output_buffering = Off
在 [XDebug]
部分,新增以下三行。
zend_extension=xdebug xdebug.mode=debug xdebug.start_with_request=trigger
一旦你儲存了你的更改,重新啟動Apache並測試Xdebug。
對於Mac,你要確保你在終端例項中使用 xcode-select --install
來安裝Xcode命令列工具。之後,有三個軟體包你要用Homebrew來安裝。
brew install autoconf automake libtool
在某些情況下,你還需要重新安裝XAMPP以獲得核心程式和 “開發者檔案”。你應該可以只重新安裝這些檔案,但你要先對你現有的設定進行備份。
接下來,在你的系統上導航到Xdebug原始檔夾的下載,解壓TGZ檔案。在一個終端視窗中,導航到該目錄並執行以下程式:
phpize pecl install xdebug
注意,你可能也需要在這裡使用 sudo
。從這裡,你可以編輯XAMPP的php.ini檔案。對於大多數macOS安裝,你可以在/Applications/XAMPP/xamppfiles/etc/php.ini中找到它。在這個目錄中,你也會找到你的xdebug.so檔案的路徑–記下它並使用它來代替本片段中的檔案路徑佔位符。
[xdebug] zend_extension=/path/to/xdebug.so xdebug.mode=develop,degug xdebug.start_with_request=yes
為了測試這是否有效,在htdocs XAMPP主目錄下建立一個新的xdebug_info.php檔案。在裡面,新增以下內容:
<?php xdebug_info();
…然後重新整理Apache並在瀏覽器中測試Xdebug。
結合PhpStorm使用Xdebug
一旦你通過作業系統和你的開發環境安裝了Xdebug,你還需要檢視偵錯程式本身。你將通過你選擇的程式碼編輯器或整合開發環境(IDE)來做這件事。就像你的環境一樣,有很多可供選擇的,每一個都可能有不同的方法。
這就是說,許多開發人員選擇使用JetBrains的PhpStorm。事實上,PhpStorm提供了 “感知WordPress的協助“–而且它也是一個受歡迎的選擇,因為有許多其他原因。
PhpStorm介面
JetBrains 網站包括連線 Xdebug 和 PhpStorm 的完整說明,但我們將在此回顧一下。
首先,在Preferences窗格中導航到Languages & Frameworks > PHP頁面。在這裡,開啟CLI Interpreter下拉欄位旁邊的More Items串選單:
在PhpStorm中選擇一個CLI直譯器
這將顯示一些關於你的 PHP 版本和直譯器的進一步細節。如果你點選Configuration file選項旁邊的More items省略號,你會看到php.ini檔案的完整路徑。
在PhpStorm中修改PHP配置
接下來你將使用這個PHP檔案來繼續設定過程
在php.ini檔案中工作
這裡的第一個任務是編輯出任何影響 Xdebug 如何與 PhpStorm 一起工作的行。
在 php.ini 檔案中,尋找以下幾行,並將其刪除或註釋掉。
zend_extension=<path_to_zend_debugger> zend_extension=<path_to_zend_optimizer>
這些行不會在所有情況下出現,所以如果你沒有看到它們,不要驚慌。
接下來,在檔案中新增以下內容。
[xdebug] zend_extension="xdebug.so" xdebug.mode=debug xdebug.client_host=127.0.0.1 xdebug.client_port="<the port (9003 by default) to which Xdebug connects>"
關於這套程式碼,有幾件事需要注意。
- 你可能已經有一個
[xdebug]
部分,在這種情況下你可以省略第一個指定。 -
zend_extension
條目可能需要你新增xdebug.so的完整路徑來連線。 - 雖然它可能看起來像一個佔位符,但
xdebug.client_port
引數是你在程式碼內的設定方式。
一旦你新增了這些,儲存並關閉檔案,然後從命令列測試PHP版本(使用 php --version
)。
使用macOS終端測試PHP和Xdebug的當前安裝
如果你有一個工作版本的Xdebug,它將顯示為PHP擴充套件之一。你也可以將 phpinfo();
新增到一個新檔案中,並在瀏覽器中進行測試。
這就是讓Xdebug作為PhpStorm的預設偵錯程式所需要做的一切。使用它之前的最後一步是安裝一個瀏覽器輔助擴充套件。
安裝一個瀏覽器輔助擴充套件
你需要在你的瀏覽器和 PhpStorm 之間建立的最後一個關鍵連線,是通過啟用伺服器上的步驟除錯來完成的。雖然你可以在命令列中使用特殊的 GET
或 POST
值來做這件事,但使用一個擴充套件是更直接的。
我們推薦使用專用的Xdebug Helper擴充套件。你可以在你選擇的瀏覽器上安裝它:
如果你想探索其他擴充套件,JetBrains網站為最流行的瀏覽器提供了一些額外的選擇。
一旦你安裝了你選擇的瀏覽器擴充套件,你不應該再調整任何進一步的配置設定。從這裡,你可以開始使用PhpStorm的Xdebug。
使用Xdebug
雖然我們在這裡使用PhpStorm,但你會看到不同IDE之間有類似的佈局和介面–儘管也會有一些明顯的區別。
有幾個概念結合起來形成了整個除錯體驗。
- 斷點。這些點是Xdebug會停下來讓你檢查輸出的地方。你可以根據自己的需要設定任意多的斷點。
- 監聽連線。你可以開啟或關閉這個功能,儘管大多數開發者總是把它開啟。
- 除錯螢幕。你的大部分時間將在除錯介面中度過–你將在這裡處理各種程式碼行、變數和引數。
第一步是啟用監聽–沒有監聽,你就無法除錯任何東西。要做到這一點,請點選工具欄上的Run > Start Listening for PHP Debug Connections選項。
在PhpStorm中開啟的執行選單
作為一種選擇,你可以點選PhpStorm工具欄中的 “telephone”圖示:
使用PhpStorm工具條內的電話圖示監聽PHP除錯連線
這兩個選項中的任何一個都會開始監聽連線。
從這裡,你可以開始在程式碼編輯器的溝槽中設定斷點。一個紅點表示一個斷點,你可以點選它來啟用:
在PhpStorm編輯頁面的溝槽內設定斷點
當你想除錯你的程式碼時,最直接的方法是開始監聽,設定斷點,然後前往瀏覽器中的特定頁面。在瀏覽器中找到你的擴充套件圖示,然後點選它,選擇 “Debug”選項:
在瀏覽器工具欄內選擇除錯選項,使用一個專門的擴充套件
這將在PhpStorm中開啟偵錯程式並提供好訊息或壞訊息:
使用PhpStorm偵錯程式與Xdebug
如果你右鍵單擊各種值、屬性、引數和變數,你將能夠訪問一個進一步的上下文選單。這為你提供了大量的額外空間來測試和除錯你的程式碼:
在PhpStorm偵錯程式中使用右鍵上下文選單來設定新值
例如,你可以沿著路徑為變數設定不同的值。這可能是故意要破壞你的程式碼,看看會發生什麼,也可能是測試已經需要修復的程式碼的一種方式。無論哪種方式,這都為你提供了一個極好的方法來除錯你的程式碼,而不需要先改變它。
命令小貼士
在我們結束這篇文章之前,我們應該提到快捷鍵。
像許多其他軟體一樣,有各種方法可以僅使用鍵盤在Xdebug(和PhpStorm)中導航。事實上,你甚至可以使用命令列來除錯PHP指令碼。
一旦Xdebug啟動並執行,你可以使用以下命令來進行操作:
命令 | 快捷方式 |
---|---|
指定要監聽的埠(如 [9003] ) |
-p [value] |
Sets a breakpoint on the specified line for the file path given. | breakpoint_set -t line file:///<path> -n <line> |
在給定檔案路徑的指定行上設定一個斷點 | run |
步入下一個可執行行 | step_into |
列出當前範圍內的變數和值 | context_get |
顯示指定屬性的值 | property_get -n <property> |
雖然您的特定程式碼編輯器將有自己的專用快捷方式,但這裡的重點是PhpStorm。請看下面的鍵盤快捷鍵表,瞭解如何將Xdebug與PhpStorm配合使用:
命令 | Windows | macOS |
---|---|---|
查詢動作 | Ctrl + Shift + A | Shift + Cmd + A |
開啟偵錯程式 | Shift + F9 | Ctrl + D |
切換斷點 | Control + F8 | Cmd + F8 |
進入 | F7 | F7 |
跨越 | F8 | F8 |
檢視斷點 | Ctrl + Shift + F8 | Shift + Cmd + F8 |
恢復程式 | F9 | F9 |
評估當前表示式 | Alt + F8 | Option + F8 |
評估當前表示式慶幸的是,這裡沒有太多需要記憶的東西。你必須開啟偵錯程式,設定每行的斷點,監聽連線,並執行你的指令碼。
然而,如果你需要一個特定任務的快捷方式,你可以使用PhpStorm查詢動作命令。
在PhpStorm中使用查詢動作選單
一旦你開始在這個空間裡打字,你就會看到一個動態的命令和相關的快捷鍵列表。你還可以通過Help > Keyboard Shortcuts PDF選單找到所有鍵盤快捷鍵的PDF版本。
如果你想在使用滑鼠工作時更多地實時檢視快捷方式,JetBrains提供了Key Promoter X外掛。
PhpStorm介面顯示Key Promoter X的通知
這個方便的工具將顯示你最近執行的動作的通知,以及其相關的鍵盤快捷鍵。一旦你學會並使用了這些快捷鍵,你就可以逐步淘汰這個外掛,恢復你螢幕上的寶貴空間。
小結
除錯的實踐已經從它卑微的開始走過了漫長的道路;現在它所包含的範圍比它的祖先所能想象的要廣得多。要想在修復PHP程式碼時進行徹底的工作,你需要使用一個合格的工具。有許多優秀的擴充套件和工具可供選擇,但Xdebug是一個有爭議的領跑者。
正如我們所看到的,Xdebug可以適應甚至是最折衷的程式碼編輯器的口味,當它與PhpStorm搭配時尤其出色。然而,無論你的設定如何,通常都會有一個Xdebug的版本來滿足你的需求。總的來說,它是一個強大、靈活和直觀的工具。
評論留言