Xdebug:PHP開發者的強大調試和性能分析工具
核心要點:
PHP是Web開發中最流行的語言,但過去常有人批評它缺乏合適的調試器。使用Java和C#等語言的開發者可以使用強大的調試工具套件,通常直接集成到他們的IDE中。但Web服務器和PHP IDE的分離性質阻礙了我們使用許多相同的工具。我們手動在代碼中添加調試語句……直到Xdebug填補了這個空白。 Xdebug是由Derick Rethans創建的免費開源項目,可能是最有用的PHP擴展之一。它提供的不僅僅是基本的調試支持,還包括堆棧跟踪、性能分析、代碼覆蓋率等等。本文將介紹如何安裝和配置Xdebug,如何從Netbeans調試PHP應用程序,以及如何在KCachegrind中讀取性能分析報告。
安裝和配置Xdebug
如果您使用的是XAMPP或MAMP,則Xdebug已預安裝;您只需在php.ini中啟用它即可。如果您在Ubuntu等平台上使用基於包的安裝,則可以使用類似apt-get install php5-xdebug
的命令通過包管理器安裝它。我的php.ini中Xdebug的條目如下所示:
<code>[xdebug] zend_extension="/Applications/MAMP/bin/php5.2/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so" xdebug.remote_enable=1 xdebug.remote_host=localhost xdebug.remote_port=9000</code>
zend_extension
指定Xdebug模塊的路徑。 xdebug.remote_enable
值切換擴展是否處於活動狀態。 xdebug.remote_host
是您的系統名稱或IP地址(這裡我指定了localhost
,因為我都在同一台機器上工作,但是如果需要為您的設置指定不同的值,則該值可以是IP地址或DNS主機名)。 xdebug.remote_port
是客戶端偵聽來自Xdebug連接的端口(9000是默認值)。使用Xdebug時,務必確保您沒有使用任何其他Zend擴展,因為它們可能會與Xdebug衝突。還有其他安裝選項。 Xdebug網站提供了一個簡單的嚮導來指導您完成安裝過程。您可以獲取phpinfo()
或php –i
的輸出,將其粘貼到文本框中,讓嚮導分析您的服務器配置,並指導您如何在您的機器上編譯Xdebug。
調試
通常情況下,使用var_dump()
和exit/die()
組合進行調試很誘人。但是這種方法的問題在於,您必須修改代碼才能進行調試;您必須記住添加輸出語句的每個位置,並在調試完成後將其刪除。 Xdebug通過允許您在任何需要的地方暫停應用程序的執行來克服這個問題。然後,您可以檢查該作用域中變量的值,以更好地了解PHP的運行情況。您可以輕鬆地配置Netbeans充當Xdebug客戶端。打開選項窗口(工具>選項),然後轉到PHP部分的調試選項卡。輸入php.ini中給出的調試端口和會話ID,您需要使用要調試的請求傳遞會話ID。現在,您可以通過單擊工具選項卡中的“調試”來運行調試器。
打開源文件後,單擊工具欄中的“調試”按鈕開始調試。它將在瀏覽器中打開應用程序,如果已在“選項”窗口中啟用“在第一行停止”選項,則PHP的執行將暫停在文件的首行。否則,它將運行直到遇到第一個斷點。從那裡,您可以使用“繼續”按鈕繼續到下一個斷點。請注意,瀏覽器URL欄中的XDEBUG_SESSION_START參數。要觸發調試器,必須將XDEBUG_SESSION_START作為請求參數(GET/POST)或XDEBUG_SESSION作為cookie參數傳遞。調試工具欄中還有一些其他有用的操作。它們是:
您可以通過單擊編輯器邊距中的行號來添加斷點,然後在斷點處暫停執行。可以通過再次單擊它們來刪除它們。或者,轉到窗口>調試>斷點,這將列出程序中的所有斷點,您可以選擇/取消選擇僅您需要的斷點。運行時,當前作用域中變量的狀態將顯示在變量窗口中。它將顯示局部變量和超級全局變量(如$_COOKIE
、$_GET
、$_POST
和$_SERVER
)的值。您可以觀察它們的值在您逐步執行語句時如何變化。
性能分析
性能分析是優化任何應用程序的第一步。性能分析工具會記錄重要的細節,例如語句和函數執行所需的時間、調用次數等等。可以分析輸出以了解瓶頸所在。 Xdebug也可以用作PHP的性能分析工具。要開始分析您的應用程序,請將以下設置添加到php.ini:
<code>[xdebug] zend_extension="/Applications/MAMP/bin/php5.2/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so" xdebug.remote_enable=1 xdebug.remote_host=localhost xdebug.remote_port=9000</code>
Xdebug中默認情況下禁用性能分析,因此xdebug.profiler_enable
用於啟用它。 xdebug.profiler_output_name
是性能分析器日誌的文件名(%t
說明符將時間戳附加到文件名;有關說明符的完整列表,請參見文檔)。 Xdebug將性能分析輸出存儲在xdebug.profiler_output_dir
指定的目錄中。您可以將其更改為您選擇的任何位置,但請記住,運行PHP腳本的用戶帳戶必須對它具有寫入權限。性能分析會降低性能,因為PHP引擎需要查看每個函數調用並記錄其詳細信息,因此您不希望一直運行它。 xdebug.profiler_enable_trigger
指示Xdebug僅在將XDEBUG_PROFILE作為GET或POST參數傳遞時才執行性能分析。 Xdebug創建的日誌文件的大小可能因應用程序的操作而異。此外,它並不真正易於閱讀。您需要使用KCachegrind或Webgrind等程序來查看它們。 KCachegrind是KDE的性能分析數據可視化工具,需要Unix環境才能運行,而Webgrind是一個基於Web的工具。在KCachegrind中打開性能分析日誌文件將顯示從main()開始的每個函數調用的成本。以下是查找階乘函數的性能分析輸出的KCachegrind可視化:
左側面板(函數概要)按執行順序顯示每個函數所花費的時間。右上角的面板以圖形方式顯示相同的信息,大小對應於函數的成本。調用圖表示應用程序中函數之間的關係。在此示例中,只有兩個函數,main()和fact()。 fact()是一個遞歸函數,在圖中用循環表示。優化代碼時,應查找總成本最高的區域。通常情況下,I/O操作的成本最高。記住盡可能減少它們。在任何有意義的地方延遲加載文件。假設您有一個名為Orders的類,它將從您的網上商店為您提供所有訂單及其詳細信息的列表。
<code>xdebug.profiler_enable = 1 xdebug.profiler_output_name = xdebug.out.%t xdebug.profiler_output_dir = /tmp xdebug.profiler_enable_trigger = 1</code>
此類具有兩種方法:getAll()和getDetails()。當您調用getAll()方法時,它將獲取orders表中的所有記錄並循環遍歷它們以獲取所有記錄的詳細信息。讓我們看看性能分析信息。
儘管絕對數字並不重要,因為它們取決於平台和運行時條件,但您將了解不同函數的相對成本。請注意,某些函數被調用了數百次(這當然很糟糕)。代碼不需要循環遍歷所有訂單並分別獲取每個訂單的詳細信息。讓我們重寫getAll()函數以使用JOIN。
<?php class Orders { protected $db; public function __construct(PDO $db) { $this->db = $db; } public function getAll() { $orders = array(); $query = "SELECT * FROM orders"; $result = $this->db->query($query); while ($row = $result->fetch(PDO::FETCH_ASSOC)) { $row['details'] = $this->getDetails($row['orderId']); $orders[] = $row; } return $orders; } public function getDetails($orderId){ $details = array(); $result = $this->db->query("SELECT * FROM orderdetails WHERE orderId = " . $orderId); while ($row = $result->fetch(PDO::FETCH_ASSOC)) { $details[] = $row; } return $details; } }
現在性能分析產生了更好的結果,因為查詢數量減少了。此外,代碼不再調用getDetails()函數了。
總結
Xdebug充當中間人,控制服務器中PHP程序的執行。在本文中,您已經看到了Xdebug最令人印象深刻的兩個特性——調試支持和性能分析支持。它的遠程調試允許您在運行時檢查值,而無需修改程序,從而更好地了解PHP的運行情況。性能分析有助於發現代碼中的瓶頸,以便您可以對其進行優化以提高性能。我希望本文能幫助您了解Xdebug的優勢,並鼓勵您立即開始使用它(如果您尚未使用)。如果您發現這是一個有價值的工具,您甚至可能想要考慮通過購買支持協議來支持這個偉大的項目。
(請注意:以上圖片佔位符需要替換為實際截圖。)
以上是PHP主|與Xdebug進行調試和分析PHP的詳細內容。更多資訊請關注PHP中文網其他相關文章!