大型服務器端程序的調試方法跟運行在個人電腦或者手持設備的程序的調試思路完全不一樣,主要體現(xiàn)在下面幾點:
- [ ] 服務器端一般是一個受限的環(huán)境,你無法安裝你所需要的所有工具和依賴的庫
- [ ] 服務器程序的Bug跟某些特定邏輯相關,這個特定邏輯可能你還未知,或者在自己PC上面很難模擬觸發(fā)(比方說大容量訪問的時候)
- [ ] 觸發(fā)機制,你總是希望在錯誤發(fā)生的時候,能夠獲取系統(tǒng)的關鍵信息用以輔助定位問題
- [ ] 既能夠自動保存關鍵信息,但是對現(xiàn)有系統(tǒng)的性能有較小影響
所以,對于上訴的需求,你需要一個可配置的輕量級調式方法(庫)來幫助你定位php系統(tǒng)的問題,xdebug是一個不錯的選擇。
- 以ubuntu為例,安裝xdebug
apt-get install php70-debug
當然如果你的系統(tǒng)不是ubuntu,你可以到xdebug官網上面去尋找對應的版本。
-
配置xdebug
xdebug有非常豐富的配置選項,我們從最簡單的開始
zend_extension = "xdebug.so" xdebug.auto_trace = 0 xdebug.show_exception_trace = 0 xdebug.collect_vars = 1 xdebug.collect_return = 1 xdebug.collect_params = 4 xdebug.trace_output_dir = "/tmp/xdebug" xdebug.profiler_append = 0 xdebug.profiler_enable = 1 xdebug.profiler_enable_trigger = 0 xdebug.profiler_output_dir = "/tmp/xdebug" xdebug.profiler_output_name = "cachegrind.out.%t-%s"xdebug.auto_trace = 1 這個參數(shù)要慎用,這個是xdebug會自動跟蹤錯誤,但是在絕大部分過程中,會導致額外的問題。
xdebug的配置文件放在/etc/php7/mods-available/xdebug.ini
-
var_dump
var_dump的價值很大程度上被新手低估,實際上var_dump有可能是你的第一(唯一)選擇,php是一個動態(tài)語言,并不需要編譯就可以運行,這里使得調試就非常的方便,通過var_dump來獲取一些關鍵信息,縮小故障范圍就非常有效。這里提及var_dump的原因是這個函數(shù)是php本身就支持的,但是自帶的版本非常不適合閱讀,在安裝了xdebug之后,xdebug會格式化var_dump的輸出,可閱讀性大大增加。var_dump的使用非常簡單:
var_dump($this);在瀏覽器里面的可能輸出:
object(main)[19] public 'user_id' => int 1 public 'user_info' => array (size=57) 'uid' => int 1 'user_name' => string 'user1' (length=9) 'email' => string 'user@aaa.com' (length=21) 'mobile' => null 'password' => string 'd55ca4ba28f97df06702c339edce8309' (length=32) 'salt' => string 'wlxb' (length=4) 'avatar_file' => null 'sex' => null 'birthday' => null 'province' => null 'city' => null 'job_id' => int 0 'reg_time' => int 1478519086 'reg_ip' => int 2886795265 'last_login' => int 1479277954 'last_ip' => int 2886795265 'online_time' => int 41488 'last_active' => int 1479277989 -
使用Log
在調試服務器端程序的時候,Log是最為基礎同樣也是最為重要的工具,Log可以幫助你記錄事件發(fā)生前后發(fā)生的事件,幫助你定位問題,幾乎所有的復雜問題調查都是從分析Log開始的。下面幾個參數(shù)跟trace的輸出結果相關。
xdebug.collect_vars = 1 xdebug.collect_return = 1 xdebug.collect_params = 4 xdebug.trace_output_dir = "/tmp/xdebug"都比較好理解,xdebug.collect_params = 4 設定用于trace的輸出方式,可以選擇1-4,下面以4舉例:
TRACE START [2007-05-06 14:37:16] 0.0003 114112 -> {main}() ../trace.php:0 0.0004 114272 -> str_split('Xdebug') ../trace.php:8 0.0007 117424 -> ret_ord($c = 'X') ../trace.php:10 0.0007 117584 -> ord('X') ../trace.php:5 0.0009 117584 -> ret_ord($c = 'd') ../trace.php:10 0.0009 117584 -> ord('d') ../trace.php:5 0.0010 117584 -> ret_ord($c = 'e') ../trace.php:10 0.0011 117584 -> ord('e') ../trace.php:5 0.0012 117584 -> ret_ord($c = 'b') ../trace.php:10 0.0013 117584 -> ord('b') ../trace.php:5 0.0014 117584 -> ret_ord($c = 'u') ../trace.php:10 0.0014 117584 -> ord('u') ../trace.php:5 0.0016 117584 -> ret_ord($c = 'g') ../trace.php:10 0.0016 117584 -> ord('g') ../trace.php:5 0.0019 41152 TRACE END [2007-05-06 14:37:16]
在php代碼中使用,記得這個要成對使用,否則長期運行trace會導致系統(tǒng)性能問題(特別是磁盤)
string xdebug_start_trace( [ string trace_file [, integer options] ] )
string xdebug_stop_trace()
如果xdebug.collect_vars = 1 開啟變量打印功能,常用的函數(shù)有下面幾種:
void xdebug_debug_zval( [string varname [, ...]] )
void xdebug_dump_superglobals()
array xdebug_get_declared_vars()
詳細的參數(shù)說明可以參考xdebug的網頁,如下:
https://xdebug.org/docs/execution_trace
-
如何更好的查看Log
?