對PHP調(diào)試的一點小心得,盡量寫的全了一些,以讓后來者少走寫彎路,如有錯誤,盡請斧正
-
基礎(chǔ)調(diào)試法/打印變量值
php有幾種非常簡便的調(diào)試,相信大多數(shù)人都是知道的,echo
,print
,print_r
,var_dump
,var_export
這幾種都是php自帶的調(diào)試方法,非常常用,為了便于理解,所以做成了表格
方法名 | 類型 | 描述 | 返回值 |
---|---|---|---|
echo | 語言結(jié)構(gòu) | 只能打印出簡單類型變量的值(如int玖院,string) | 沒有返回值 |
語言結(jié)構(gòu) | 只能打印出簡單類型變量的值(如int呻疹,string) | 總是返回1 | |
print_r | 函數(shù) | 可以打印出復(fù)雜類型變量的值(如數(shù)組戳稽、對象)以列表的形式顯示察署,并以array、object開頭 | 如果想捕捉 print_r() 的輸出拜姿,可使用 第二個(return) 參數(shù)烙样。若此參數(shù)設(shè)為 TRUE,print_r() 將不打印結(jié)果蕊肥,而是返回其輸出谒获。 |
var_dump | 函數(shù) | 可判斷多個變量的類型和長度蛤肌,并輸出變量的數(shù)值,更適合調(diào)試 | 沒有返回值 |
var_export | 函數(shù) | 和 var_dump() 類似,不同的是其返回的表示是合法的 PHP 代碼批狱。 | 同print_r |
dump | 函數(shù) | 大部分框架自帶的調(diào)試函數(shù),用于var_dump()友好(格式化)的輸出,有些框架可能沒有 | 見具體函數(shù) |
-
基礎(chǔ)調(diào)試法/打印腳本運行時間
php的執(zhí)行速度是非陈阕迹快速的,往往執(zhí)行一個腳本的時間不到一秒中,所以如果我們想測試一下執(zhí)行時間的話,用時間戳就不行了,就要借助一個函數(shù)microtime
它會返回當(dāng)前時間戳和微秒數(shù),但是他的格式并不是很方便,我們需要寫一個函數(shù)方便調(diào)試
function get_microtime()
{
list( $usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
然后在開始出調(diào)用一次,再在結(jié)束前調(diào)用此,最后用開始的時間減去結(jié)束的時間便可以拿到腳本運行時間
-
基礎(chǔ)調(diào)試法/打印腳本運行時間
PHP提供了一個函數(shù)可以直接打印出PHP占用的內(nèi)存量,memory_get_usage
,但是返回的單位是字節(jié)(byte),這非常不方便我們的調(diào)試,于是我們需要一個函數(shù)轉(zhuǎn)化單位
function convert($size)
{
$unit=array('b','kb','mb','gb','tb','pb');
return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}
-
基礎(chǔ)調(diào)試法/堆棧追蹤(Stack Trace)
PHP提供可以打印堆棧的函數(shù),所謂(堆棧追蹤/堆棧打印)就是打印出程序運行到異常時所加載的文件和執(zhí)行的函數(shù),有了它我們可以很方便的確定是程序在哪里出了問題(特別是在自己不熟悉的項目內(nèi))
debug_print_backtrace()
,debug_backtrace()
還可以直接調(diào)用異常類中的函數(shù)
$e = new Exception;
var_dump($e->getTraceAsString());
當(dāng)然,,大多數(shù)框架都會為你集成這個功能,但是掌握此函數(shù)會讓你更加靈活的利用堆棧去熟悉,調(diào)試代碼
-
基礎(chǔ)調(diào)試法/打印到文件
在很多場景下,比如第三方服務(wù)的回調(diào),又或者線上調(diào)試時,是不能直接打印出來的,所以我們需要一個能讓我們確定程序是否正確運行的但是又不直接打印到頁面上的函數(shù)
function mlog(){
$args = func_get_args();
foreach ($args as $arg){
file_put_contents('debug.txt', var_export($arg,true)."\n",FILE_APPEND);
}
}
借助于此函數(shù)能把變量寫到根目錄下的debug,txt里面,從而讓我們確定程序的執(zhí)行情況
-
Xdebug簡介
- 下載
Xdebug是PHP的一個拓展,需要手動去安裝并開啟,Xdebug是有很多個版本的,很多人第一次裝都不知道選什么,導(dǎo)致耽誤大量時間,其實是有一個更好的辦法的https://xdebug.org/wizard.php, Xdebug的官方提供了一個檢測工具,只需要打印出PHP的信息phpinfo()
,然后ctrl+c
,ctrl+v
變回給出適合的版本鏈接,非常方便.
- 下載
- 開啟拓展
下載完成后需要把文件拖入ext文件夾,然后在php.ini文件中加入以下配置,最后勾選拓展,重啟服務(wù)器,就ok了
- 開啟拓展
[xdebug]
zend_extension ="C:/path/php-7.1.7-Win32-VC14-x64/ext/php_xdebug-2.6.0beta1-7.1-vc14-x86_64.dll" (拓展的絕對路徑)
xdebug.remote_enable = 1
xdebug.profiler_enable_trigger = off
xdebug.profiler_output_name = "cachegrind.out.%p"
xdebug.show_local_vars=0
xdebug.remote_autostart=1
xdebug.profiler_enable = off (如果需要生成分析文件進行性能分析的話,設(shè)置為on,如果不需要記得設(shè)置為off哦,不然會影響性能的)
xdebug.profiler_output_dir ="C:/pach/tmp/xdebug"(生成的分析文件的存放文件夾,不需要可以不設(shè)置)
xdebug.trace_output_dir ="C:/pach/tmp/xdebug"(生成的分析文件的存放文件夾,不需要可以不設(shè)置)
- Xdebug的效果(部分)
1.美化var_dump
的輸出
更簡單的打印腳本運行時間,只用一個函數(shù)
xdebug_time_index()
便可以拿到腳本運行時間可以打印內(nèi)存占用峰值
xdebug_peak_memory_usage()
,但是單位仍是字節(jié)
4.可以進行斷點調(diào)試
5.更方便的查看堆棧
6.可以進行性能分析 (Profile功能)
- 關(guān)于性能分析
除了性能分析,其他的功能都可以使用PHP原生實現(xiàn),但是性能分析的工具(wincachegrind)對windows好像并不是很支持,本貓踩了許多天的坑都沒踩出來,于是決定以后再補 (:逃~
- 關(guān)于性能分析