很多PHP程式員調試使用echo、print_r()、var_dump()、printf()等,雖然對於有較豐富開發經驗的程式員來說這些也已經足夠了,他們往往可以在程式執行的過程中,通過輸出特定變數的值可以判斷程式執行是否正確,甚至效率高低也可以看出來(當然可能還需要使用一些時間函數)。那麼我們為什麼還需要一個專門的偵錯工具來監控我們的程式運行呢。
在我們平時的php開發中,一個大的項目經過長時間的積累以後你會發現效能越來越慢,而效能到底消耗在了什麼地方,常常是一個令人頭疼的問題,function a()調用了多少次,function b()又消耗了多少時間,我們到底怎麼尋找是哪個蛀蟲拉慢了我們的程式運行速度呢。在這裡給大家介紹一款工具xdebug,相信很多人已經聽說過了,希望藉助這個工具我們可以起到簡單分析php程式效能瓶頸的問題。 XDebug是什麼
XDebug是一個開放原始碼的PHP程式調試器(即一個Debug工具),可以用來跟蹤,調試和分析PHP程式的健全狀態。 安裝XDebug 訪問 www.xdebug.org ,下載php_xdebug.dll,根據版本號碼與自己的作業系統、PHP版本下載合適的。 將下載的php_xdebug.dll放到PHP的安裝目錄php\ext下。 編輯php.ini,有些集合環境已內建xdebug的配置,如果沒有則自己手動加入下面幾行:
2 |
zend_extension = "/home/ad/php/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so" |
4 |
xdebug.auto_profile = on |
5 |
xdebug.collect_params = on |
6 |
xdebug.collect_return = on |
7 |
xdebug.profiler_enable = on |
8 |
xdebug.trace_output_dir = "/home/ad/xdebug_log" |
9 |
xdebug.profiler_output_dir = "/home/ad/xdebug_log" |
XDebug參數簡介: zend_extension 載入xdebug擴充 xdebug.auto_trace 自動開啟開啟函數調用監測 xdebug.auto_profile 自動開啟效能監測 xdebug.trace_output_dir 設定函數調用監測資訊的輸出檔案的路徑。 xdebug.profiler_output_dir 設定效能監測資訊輸出檔案的路徑。 xdebug.collect_params 開啟收集“函數參數”的功能。將函數調用的參數值列入函數程序呼叫的監測資訊中。 xdebug.collect_return 開啟收集“函數傳回值”的功能。將函數的傳回值列入函數程序呼叫的監測資訊中。 重啟Apache。 寫一個test.php,內容為<?php phpinfo(); ?>,如果輸出的內容中有看到xdebug,說明安裝配置成功。或者去/home/ad/xdebug_log下看看是不是日誌已經出來了。 設定選項
Category |
Setting |
Description |
日誌 |
xdebug.trace_output_dir |
日誌追蹤輸出目錄 |
xdebug.trace_output_name |
記錄檔名,xdebug提供了一系列的標識符,產生相應格式的檔案名稱,具體請參考官網 |
xdebug.trace_options |
記錄添加到檔案中方式:1 = 追加(如果存在該檔案). 0 (default) = 覆蓋(如果存在該檔案) |
顯示資料 |
xdebug.collect_params |
非零值 = 控制function的參數顯示選項 0 = 不顯示. 1 = 參數類型,值 (例如:array(9)). 2 = 同上1,只是在CLI模式下略微有區別 3 = 所有變數內容 4 = 所有變數內容和變數名(例如:array(0 => 9)). |
xdebug.collect_return |
1 = 顯示function傳回值. Default 0 不顯示 |
xdebug.collect_vars |
1 = 顯示當前範圍使用了哪些變數,顯示變數名,該選項不會記錄變數的值,如果需要,使用xdebug.collect_params |
xdebug.collect_assignments |
1 = 添加一行顯示變數賦值(若為1,形如$a = 1;這類Assignment Expression會在trace檔案裡顯示) |
格式 |
xdebug.trace_format |
0 = 人可讀. 從左至右每列分別表示:時間點, 記憶體, 記憶體差 (需要設定xdebug.show_mem_delta=1), 等級, 函數名,函數參數 (需要設定,xdebug.collect_params=1,只要是非零), 當前程式碼所在檔案名稱 , 行號. 1 = 機器可讀[1]. 需要藉助第三方app,例如:xdebug trace file parser 或者 xdebug trace viewer 2 = html格式 即table,用browser開啟,顯示table |
xdebug.show_mem_delta |
1 = 顯示每次函數調用記憶體消耗(記憶體差) |
行為 |
xdebug.auto_trace |
1 = 開啟自動追蹤. (追蹤方式有2種,一種是自動追蹤,所有php指令碼運行時,都會產生trace檔案;另一種是觸發方式追蹤,如下) |
xdebug.trace_enable_trigger[2] |
1 = 使用 XDEBUG_TRACE GET/POST 觸發追蹤, 或者通過設定cookie XDEBUG_TRACE. 為了避免每次請求時,都會產生相應trace追蹤檔案,你需要把auto_trace設定為0 註:該特性只在2.2+版本才能設定
[xdebug-general] Re: Is trace_enable_trigger defunct? |
限制 |
xdebug.var_display_max_depth |
數組和對象元素顯示深度:主要用在數組嵌套,對象屬性嵌套時,顯示幾級的元素內容. Default 3. |
xdebug.var_display_max_data |
變數值為字串時顯示多長. Default 512. |
xdebug.var_display_max_children |
數組和對象元素顯示的個數. Default 128
|
一些自訂函數
Function |
Description |
void xdebug_enable() |
手動開啟,相當於xdebug.default_enable=on |
void var_dump() |
覆寫php提供的var_dump,出錯時,顯示函數堆棧資訊,(前提:php.ini裡html_errors為1),使用xdebug.overload_var_dump 設定是否覆寫 |
void xdebug_start_trace( string trace_file_path [, integer options] ) |
手動控制需要追蹤的程式碼片段 trace_file_path :檔案路徑(相對或絕對,若為空白).如果為空白,或者不傳參, 使用xdebug.trace_output_dir設定的目錄 options : XDEBUG_TRACE_APPEND: 1 = 追加檔案內容末尾, 0 = 覆寫該檔案 XDEBUG_TRACE_COMPUTERIZED: 2 =同 xdebug.trace_format=1 . XDEBUG_TRACE_HTML: 4 = 輸出HTML表格,瀏覽器開啟為一table |
void xdebug_stop_trace() |
停止追蹤,代碼追蹤在該行停止 |
string xdebug_get_tracefile_name() |
獲得輸出檔案名,與 xdebug.auto_trace配合使用. |
void xdebug_var_dump([mixed var[,...]]) |
輸出變數詳細資料,相當於php裡的var_dump,具體顯示請看這裡 |
xdebug.show_local_vars |
預設為0,不顯示;非零時,在php執行出錯時,顯示出錯代碼所在範圍所有本地變數(註:這會產生大量資訊,因此預設是closed),具體顯示差別如下圖[3] |
array xdebug_get_declared_vars() |
顯示當前範圍中已聲明的變數 |
array xdebug_get_code_coverage() |
顯示某一段代碼內,代碼執行到哪些行[4] |
關於xdebug.trace_format=1,如果你使用觸發方式啟用代碼追蹤:(xdebug.auto_trace = 0;xdebug.trace_enable_trigger = 1),那麼,你可以在URL裡添加XDEBUG_TRACE,例如:localhost/test.php?XDEBUG_TRACE,或者localhost//test.php?XDEBUG_TRACE=1(任意值)。
是不是覺得很麻煩,那麼裝個外掛程式,讓它來幫你。Chrome XDEBUG Helper,使用它,你可以切換3種狀態,disabled ,debugging enabled,profiling enabled(下篇詳細介紹),然後切換到debugging enabled。運行該指令碼,(去掉URL裡的?XDEBUG_TRACE),就可以代碼跟蹤了。
使用xdebug_start_trace()和xdebug_stop_trace()可以手動追蹤你的代碼執行情況。
2 |
//your code required to trace |
設定 xdebug.auto_trace = 1 將在執行所有 PHP 指令碼之前先啟用自動跟蹤。另外,您可以通過代碼設定 xdebug.auto_trace = 0,並分別使用 xdebug_start_trace() 和 xdebug_stop_trace() 函數啟用和禁用跟蹤。但是,如果 xdebug.auto_trace 為 1,則可以在包括配置好的 auto_prepend_file 之前先啟動跟蹤。
選項 xdebug.trace_ouput_dir 和 xdebug.trace_output_name 用於控制儲存跟蹤輸出的位置。在這裡,所有檔案都被儲存到 /tmp/traces 中,並且每個追蹤檔案都以 trace 為開頭,後接 PHP 指令碼的名稱(%s)以及進程 ID(%p)。所有 Xdebug 追蹤檔案都以 .xt 尾碼結尾。
預設情況下,XDebug 將顯示時間、記憶體使用量量、函數名和函數調用深度欄位。如果將 xdebug.trace_format 設為 0,則輸出將符合人類閱讀習慣(將參數設為 1 則為機器可讀格式)。此外,如果指定 xdebug.show_mem_delta = 1,則可以查看記憶體使用量量是在增加還是在減少,而如果指定 xdebug.collect_params = 4,則可以查看傳入參數的類型和值。要監視每個函數返回的值,請設定 xdebug.collect_return = 1。