PHP->調(diào)試篇

對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) 沒有返回值
print 語言結(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的輸出

  1. 更簡單的打印腳本運行時間,只用一個函數(shù)xdebug_time_index()便可以拿到腳本運行時間

  2. 可以打印內(nèi)存占用峰值xdebug_peak_memory_usage(),但是單位仍是字節(jié)

4.可以進行斷點調(diào)試

5.更方便的查看堆棧

6.可以進行性能分析 (Profile功能)

    • 關(guān)于性能分析
      除了性能分析,其他的功能都可以使用PHP原生實現(xiàn),但是性能分析的工具(wincachegrind)對windows好像并不是很支持,本貓踩了許多天的坑都沒踩出來,于是決定以后再補 (:逃~
create_repo.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赔硫,隨后出現(xiàn)的幾起案子炒俱,更是在濱河造成了極大的恐慌,老刑警劉巖爪膊,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件权悟,死亡現(xiàn)場離奇詭異,居然都是意外死亡推盛,警方通過查閱死者的電腦和手機峦阁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耘成,“玉大人拇派,你說我怎么就攤上這事≡涮” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵疮方,是天一觀的道長控嗜。 經(jīng)常有香客問我,道長骡显,這世上最難降的妖魔是什么疆栏? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮惫谤,結(jié)果婚禮上壁顶,老公的妹妹穿的比我還像新娘。我一直安慰自己溜歪,他們只是感情好若专,可當(dāng)我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蝴猪,像睡著了一般调衰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上自阱,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天嚎莉,我揣著相機與錄音,去河邊找鬼沛豌。 笑死趋箩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叫确,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼跳芳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了启妹?” 一聲冷哼從身側(cè)響起筛严,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饶米,沒想到半個月后桨啃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡檬输,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年照瘾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丧慈。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡析命,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逃默,到底是詐尸還是另有隱情鹃愤,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布完域,位于F島的核電站软吐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吟税。R本人自食惡果不足惜凹耙,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肠仪。 院中可真熱鬧肖抱,春花似錦、人聲如沸异旧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吮蛹。三九已至欲险,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匹涮,已是汗流浹背天试。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留然低,地道東北人喜每。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓务唐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親带兜。 傳聞我的和親對象是個殘疾皇子枫笛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,566評論 2 349