大型服務(wù)器端程序的調(diào)試方法跟運(yùn)行在個(gè)人電腦或者手持設(shè)備的程序的調(diào)試思路完全不一樣,主要體現(xiàn)在下面幾點(diǎn):
- [ ] 服務(wù)器端一般是一個(gè)受限的環(huán)境强衡,你無(wú)法安裝你所需要的所有工具和依賴的庫(kù)
- [ ] 服務(wù)器程序的Bug跟某些特定邏輯相關(guān)擦秽,這個(gè)特定邏輯可能你還未知,或者在自己PC上面很難模擬觸發(fā)(比方說(shuō)大容量訪問的時(shí)候)
- [ ] 觸發(fā)機(jī)制,你總是希望在錯(cuò)誤發(fā)生的時(shí)候感挥,能夠獲取系統(tǒng)的關(guān)鍵信息用以輔助定位問題
- [ ] 既能夠自動(dòng)保存關(guān)鍵信息缩搅,但是對(duì)現(xiàn)有系統(tǒng)的性能有較小影響
所以,對(duì)于上訴的需求链快,你需要一個(gè)可配置的輕量級(jí)調(diào)式方法(庫(kù))來(lái)幫助你定位php系統(tǒng)的問題誉己,xdebug是一個(gè)不錯(cuò)的選擇。
- 以u(píng)buntu為例域蜗,安裝xdebug
apt-get install php70-debug
當(dāng)然如果你的系統(tǒng)不是ubuntu巨双,你可以到xdebug官網(wǎng)上面去尋找對(duì)應(yīng)的版本。
-
配置xdebug
xdebug有非常豐富的配置選項(xiàng)霉祸,我們從最簡(jiǎn)單的開始
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 這個(gè)參數(shù)要慎用筑累,這個(gè)是xdebug會(huì)自動(dòng)跟蹤錯(cuò)誤,但是在絕大部分過(guò)程中丝蹭,會(huì)導(dǎo)致額外的問題慢宗。
xdebug的配置文件放在/etc/php7/mods-available/xdebug.ini
-
var_dump
var_dump的價(jià)值很大程度上被新手低估,實(shí)際上var_dump有可能是你的第一(唯一)選擇奔穿,php是一個(gè)動(dòng)態(tài)語(yǔ)言镜沽,并不需要編譯就可以運(yùn)行,這里使得調(diào)試就非常的方便贱田,通過(guò)var_dump來(lái)獲取一些關(guān)鍵信息缅茉,縮小故障范圍就非常有效。這里提及var_dump的原因是這個(gè)函數(shù)是php本身就支持的男摧,但是自帶的版本非常不適合閱讀蔬墩,在安裝了xdebug之后,xdebug會(huì)格式化var_dump的輸出耗拓,可閱讀性大大增加拇颅。var_dump的使用非常簡(jiǎn)單:
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
在調(diào)試服務(wù)器端程序的時(shí)候,Log是最為基礎(chǔ)同樣也是最為重要的工具乔询,Log可以幫助你記錄事件發(fā)生前后發(fā)生的事件樟插,幫助你定位問題,幾乎所有的復(fù)雜問題調(diào)查都是從分析Log開始的竿刁。下面幾個(gè)參數(shù)跟trace的輸出結(jié)果相關(guān)岸夯。
xdebug.collect_vars = 1 xdebug.collect_return = 1 xdebug.collect_params = 4 xdebug.trace_output_dir = "/tmp/xdebug"
都比較好理解,xdebug.collect_params = 4 設(shè)定用于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代碼中使用勉吻,記得這個(gè)要成對(duì)使用监婶,否則長(zhǎng)期運(yùn)行trace會(huì)導(dǎo)致系統(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()
詳細(xì)的參數(shù)說(shuō)明可以參考xdebug的網(wǎng)頁(yè),如下:
https://xdebug.org/docs/execution_trace
-
如何更好的查看Log
?