ThinkPHP+PhpStorm常用調(diào)試方法

作者開(kāi)發(fā)PHP項(xiàng)目使用的是ThinkPHP3.2+PhpStorm這樣的環(huán)境,下面結(jié)合實(shí)際開(kāi)發(fā)經(jīng)歷介紹一下常見(jiàn)的調(diào)試方法焙贷。

[ThinkPHP框架開(kāi)啟調(diào)試模式]

ThinkPHP有專門(mén)為開(kāi)發(fā)過(guò)程而設(shè)置的調(diào)試模式拍皮,開(kāi)啟調(diào)試模式后歹叮,會(huì)犧牲一定的執(zhí)行效率跑杭,但帶來(lái)的方便和除錯(cuò)功能非常值得。

如何開(kāi)啟
開(kāi)啟調(diào)試模式很簡(jiǎn)單盗胀,只需要在入口文件中增加一行常量定義代碼艘蹋。在完成開(kāi)發(fā)階段部署到生產(chǎn)環(huán)境后锄贼,只需要關(guān)閉調(diào)試模式或者刪除調(diào)試模式定義代碼即可切換到部署模式票灰。

<?php
 // 開(kāi)啟調(diào)試模式
 define('APP_DEBUG', true);
 // 定義應(yīng)用目錄
 define('APP_PATH', './Application/');
 // 加載框架入口文件
 require './ThinkPHP/ThinkPHP.php';

調(diào)試模式的優(yōu)點(diǎn)在于:

  • 開(kāi)啟日志記錄,任何錯(cuò)誤信息和調(diào)試信息都會(huì)詳細(xì)記錄宅荤,便于調(diào)試屑迂;
  • 關(guān)閉模板緩存,模板修改可以即時(shí)生效冯键;
  • 記錄SQL日志惹盼,方便分析SQL;
  • 關(guān)閉字段緩存惫确,數(shù)據(jù)表字段修改不受緩存影響手报;
  • 嚴(yán)格檢查文件大小寫(xiě)(即使是Windows平臺(tái)),幫助你提前發(fā)現(xiàn)Linux部署可能導(dǎo)致的隱患問(wèn)題改化;
  • 通過(guò)頁(yè)面Trace功能更好的調(diào)試和發(fā)現(xiàn)錯(cuò)誤掩蛤;

[日志]

日志的處理工作是由系統(tǒng)自動(dòng)進(jìn)行的,在開(kāi)啟日志記錄的情況下陈肛,會(huì)記錄下允許的日志級(jí)別的所有日志信息揍鸟。

框架默認(rèn)是在調(diào)試模式下記錄日志信息,如果需要在部署模式下開(kāi)啟日志記錄句旱,需要在配置中開(kāi)啟LOG_RECORD參數(shù)阳藻,以及可以在應(yīng)用配置文件中配置需要記錄的日志級(jí)別。日志的記錄并非實(shí)時(shí)保存的谈撒,只有當(dāng)當(dāng)前請(qǐng)求完成或者異常結(jié)束后才會(huì)實(shí)際寫(xiě)入日志信息腥泥,否則只是記錄在內(nèi)存中。

'LOG_RECORD' => true, // 開(kāi)啟日志記錄
'LOG_LEVEL'  =>'EMERG,ALERT,CRIT,ERR', // 只記錄EMERG ALERT CRIT ERR 錯(cuò)誤

手動(dòng)記錄日志
這里啃匿,主要介紹下利用框架提供的Log日志類的三個(gè)方法來(lái)手動(dòng)記錄日志蛔外。

  1. Log::record(),記錄日志信息到內(nèi)存立宜。
    \Think\Log::record('測(cè)試日志信息');
    \Think\Log::record('測(cè)試日志信息冒萄,這是警告級(jí)別','WARN');//默認(rèn)的話記錄的日志級(jí)別是ERR,也可以指定日志級(jí)別
  2. Log::save()橙数,把保存在內(nèi)存中的日志信息(用指定的記錄方式)寫(xiě)入尊流。
    由于系統(tǒng)在請(qǐng)求結(jié)束后會(huì)自動(dòng)調(diào)用Log::save方法,所以通常灯帮,你只需要調(diào)用Log::record記錄日志信息即可崖技。
  3. Log::write()逻住,實(shí)時(shí)寫(xiě)入一條日志信息。
    采用record方法記錄的日志信息不是實(shí)時(shí)保存的迎献,如果需要實(shí)時(shí)記錄的話瞎访,可以采用write方法。write方法寫(xiě)入日志的時(shí)候 不受配置的允許日志級(jí)別影響吁恍,可以實(shí)時(shí)寫(xiě)入任意級(jí)別的日志信息扒秸。
    \Think\Log::write('測(cè)試日志信息,這是警告級(jí)別冀瓦,并且實(shí)時(shí)寫(xiě)入','WARN');

[利用Xdebug工具]

參見(jiàn)我寫(xiě)的另外一篇文章伴奥,Mac下給PhpStorm安裝調(diào)試工具Xdebug

[變量調(diào)試]

變量調(diào)試對(duì)于簡(jiǎn)單的問(wèn)題可以起到很快捷的調(diào)試作用,有時(shí)候通過(guò)對(duì)變量的觀察可以迅速定位到問(wèn)題位置翼闽,但是對(duì)比使用Xdebug方法拾徙,缺乏流程性和整體觀。

  1. echo方法
    echo 輸出一個(gè)或者多個(gè)字符串或變量值感局,多個(gè)值之間用逗號(hào)分隔尼啡,他是php語(yǔ)句,不是函數(shù)询微。因?yàn)樗皇呛瘮?shù)崖瞭,所以沒(méi)有返回值,不能作為表達(dá)式的一部分使用拓提。
    echo $str,'world','hello读恃!';
    echo $str;
  2. print方法
    print()用于輸出一個(gè)或多個(gè)字符串或變量值的信息。它只能打印出簡(jiǎn)單類型變量的值(如int,string)代态,不能打印數(shù)組和對(duì)象寺惫。稍慢于echo。
  3. print_r方法
    可以把字符串和數(shù)字簡(jiǎn)單地打印出來(lái)蹦疑,而數(shù)組則以括起來(lái)的鍵和值得列表形式顯示西雀,并以Array開(kāi)頭。print_r返回值是布爾型的,參數(shù)是mix類型的,可以是字符串,整形,數(shù)組,對(duì)象類print_r() 顯示關(guān)于一個(gè)變量的易于理解的信息歉摧。如果給出的是 string艇肴、integer 或 float,將打印變量值本身叁温。如果給出的是 array再悼,將會(huì)按照一定格式顯示鍵和元素。print_r() 對(duì)數(shù)組作用后將把數(shù)組的指針移到最后邊膝但。使用 reset() 可讓指針回到開(kāi)始處冲九。
    $data = ['test1', 'test2', 'test3', 'test' => 'test'];
    print_r($data);//Array ( [0] => test1 [1] => test2 [2] => test3 [test] => test )
  4. var_dump方法
    用于顯示關(guān)于一個(gè)或多個(gè)表達(dá)式的結(jié)構(gòu)信息,包括表達(dá)式的類型與值跟束。數(shù)組將遞歸展開(kāi)值莺奸,通過(guò)縮進(jìn)顯示其結(jié)構(gòu)丑孩。信息比較詳細(xì),用的較多灭贷。
    $data = ['test1', 'test2', 'test3', 'test' => 'test'];
    var_dump($data);
    array (size=4)
    //輸出
    0 => string 'test1' (length=5)
    1 => string 'test2' (length=5)
    2 => string 'test3' (length=5)
    'test' => string 'test' (length=4)
  5. dump方法
    dump不是php方法温学,屬于ThinkPHP框架自帶的,工能和var_dump差不多甚疟。

[性能調(diào)試]

開(kāi)發(fā)過(guò)程中仗岖,有些時(shí)候?yàn)榱藴y(cè)試性能,經(jīng)常需要調(diào)試某段代碼的運(yùn)行時(shí)間或者內(nèi)存占用開(kāi)銷古拴,系統(tǒng)提供了G方法可以很方便的獲取某個(gè)區(qū)間的運(yùn)行時(shí)間和內(nèi)存占用情況箩帚。

G('begin','end') 表示統(tǒng)計(jì)begin位置到end位置的執(zhí)行時(shí)間(單位是秒),begin必須是一個(gè)已經(jīng)標(biāo)記過(guò)的位置黄痪,如果這個(gè)時(shí)候end位置還沒(méi)被標(biāo)記過(guò),則會(huì)自動(dòng)把當(dāng)前位置標(biāo)記為end標(biāo)簽盔然,輸出的結(jié)果類似于:0.0056s

G('begin');
$data = ['test1', 'test2', 'test3', 'test' => 'test'];//這里是其他代碼
G('end');
echo G('begin', 'end', 5) . 's';//數(shù)字代表保留幾位小數(shù)

如果環(huán)境支持內(nèi)存占用統(tǒng)計(jì)的話桅打,還可以使用G方法進(jìn)行區(qū)間內(nèi)存開(kāi)銷統(tǒng)計(jì)(單位為kb)

G('begin','end','m').'kb';

[模型調(diào)試]

  1. 調(diào)試執(zhí)行的SQL語(yǔ)句
    getLastsql方法來(lái)輸出上次執(zhí)行的sql語(yǔ)句,有時(shí)候數(shù)據(jù)不符合預(yù)期時(shí)愈案,用此方法可以方便的觀察查詢語(yǔ)句挺尾,判斷邏輯是否有誤。
    $User = M("User"); // 實(shí)例化User對(duì)象
    $User->find(1);
    echo $User->getLastSql();
    // 3.2版本中可以使用簡(jiǎn)化的方法
    echo $User->_sql();
  2. 調(diào)試數(shù)據(jù)庫(kù)錯(cuò)誤信息

CURD操作如果返回值為false站绪,表示數(shù)據(jù)庫(kù)操作發(fā)生錯(cuò)誤遭铺,這個(gè)時(shí)候就需要使用模型的getDbError方法來(lái)查看數(shù)據(jù)庫(kù)返回的具體錯(cuò)誤信息。

   $User = M("User"); // 實(shí)例化User對(duì)象
   $result = $User->find(1);
   if(false === $result){
       echo $User->getDbError();
   }      
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末恢准,一起剝皮案震驚了整個(gè)濱河市魂挂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌馁筐,老刑警劉巖涂召,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異敏沉,居然都是意外死亡果正,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)盟迟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秋泳,“玉大人,你說(shuō)我怎么就攤上這事攒菠∑戎澹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵要尔,是天一觀的道長(zhǎng)舍杜。 經(jīng)常有香客問(wèn)我新娜,道長(zhǎng),這世上最難降的妖魔是什么既绩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任概龄,我火速辦了婚禮,結(jié)果婚禮上饲握,老公的妹妹穿的比我還像新娘私杜。我一直安慰自己,他們只是感情好救欧,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布衰粹。 她就那樣靜靜地躺著,像睡著了一般笆怠。 火紅的嫁衣襯著肌膚如雪铝耻。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天蹬刷,我揣著相機(jī)與錄音瓢捉,去河邊找鬼。 笑死办成,一個(gè)胖子當(dāng)著我的面吹牛泡态,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播迂卢,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼某弦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了而克?” 一聲冷哼從身側(cè)響起靶壮,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拍摇,沒(méi)想到半個(gè)月后亮钦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡充活,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蜂莉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片混卵。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡映穗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幕随,到底是詐尸還是另有隱情蚁滋,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站辕录,受9級(jí)特大地震影響睦霎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜走诞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一副女、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚣旱,春花似錦碑幅、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至异吻,卻和暖如春裹赴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涧黄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工篮昧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人笋妥。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像窄潭,于是被迫代替她去往敵國(guó)和親春宣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理嫉你,服務(wù)發(fā)現(xiàn)月帝,斷路器,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • 個(gè)人學(xué)習(xí)批處理的初衷來(lái)源于實(shí)際工作幽污;在某個(gè)迭代版本有個(gè)BS(安卓手游模擬器)大需求嚷辅,從而在測(cè)試過(guò)程中就重復(fù)涉及到...
    Luckykailiu閱讀 4,691評(píng)論 0 11
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 6,358評(píng)論 0 17
  • 第1章 小試牛刀 $ 是普通用戶距误,# 表示管理員用戶 root簸搞。 shebang:#!。sharp / hash ...
    巴喬書(shū)摘閱讀 6,326評(píng)論 1 4
  • 01 我又拒絕了一位家長(zhǎng)。 早上刑然,李師兄和我端坐喝茶寺擂,聊著《獵場(chǎng)》的新動(dòng)態(tài)。 電話響了,周師兄來(lái)電咨詢怔软。大概是說(shuō)垦细,...
    院長(zhǎng)X大叔閱讀 314評(píng)論 2 12