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

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

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

ThinkPHP有專門為開發(fā)過程而設置的調(diào)試模式,開啟調(diào)試模式后,會犧牲一定的執(zhí)行效率,但帶來的方便和除錯功能非常值得。

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

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

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

  • 開啟日志記錄,任何錯誤信息和調(diào)試信息都會詳細記錄,便于調(diào)試;
  • 關(guān)閉模板緩存,模板修改可以即時生效;
  • 記錄SQL日志,方便分析SQL;
  • 關(guān)閉字段緩存,數(shù)據(jù)表字段修改不受緩存影響;
  • 嚴格檢查文件大小寫(即使是Windows平臺),幫助你提前發(fā)現(xiàn)Linux部署可能導致的隱患問題;
  • 通過頁面Trace功能更好的調(diào)試和發(fā)現(xiàn)錯誤;

[日志]

日志的處理工作是由系統(tǒng)自動進行的,在開啟日志記錄的情況下,會記錄下允許的日志級別的所有日志信息。

框架默認是在調(diào)試模式下記錄日志信息,如果需要在部署模式下開啟日志記錄,需要在配置中開啟LOG_RECORD參數(shù),以及可以在應用配置文件中配置需要記錄的日志級別。日志的記錄并非實時保存的,只有當當前請求完成或者異常結(jié)束后才會實際寫入日志信息,否則只是記錄在內(nèi)存中。

'LOG_RECORD' => true, // 開啟日志記錄
'LOG_LEVEL'  =>'EMERG,ALERT,CRIT,ERR', // 只記錄EMERG ALERT CRIT ERR 錯誤

手動記錄日志
這里,主要介紹下利用框架提供的Log日志類的三個方法來手動記錄日志。

  1. Log::record(),記錄日志信息到內(nèi)存。
    \Think\Log::record('測試日志信息');
    \Think\Log::record('測試日志信息,這是警告級別','WARN');//默認的話記錄的日志級別是ERR,也可以指定日志級別
  2. Log::save(),把保存在內(nèi)存中的日志信息(用指定的記錄方式)寫入。
    由于系統(tǒng)在請求結(jié)束后會自動調(diào)用Log::save方法,所以通常,你只需要調(diào)用Log::record記錄日志信息即可。
  3. Log::write(),實時寫入一條日志信息。
    采用record方法記錄的日志信息不是實時保存的,如果需要實時記錄的話,可以采用write方法。write方法寫入日志的時候 不受配置的允許日志級別影響,可以實時寫入任意級別的日志信息。
    \Think\Log::write('測試日志信息,這是警告級別,并且實時寫入','WARN');

[利用Xdebug工具]

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

[變量調(diào)試]

變量調(diào)試對于簡單的問題可以起到很快捷的調(diào)試作用,有時候通過對變量的觀察可以迅速定位到問題位置,但是對比使用Xdebug方法,缺乏流程性和整體觀。

  1. echo方法
    echo 輸出一個或者多個字符串或變量值,多個值之間用逗號分隔,他是php語句,不是函數(shù)。因為他不是函數(shù),所以沒有返回值,不能作為表達式的一部分使用。
    echo $str,'world','hello!';
    echo $str;
  2. print方法
    print()用于輸出一個或多個字符串或變量值的信息。它只能打印出簡單類型變量的值(如int,string),不能打印數(shù)組和對象。稍慢于echo。
  3. print_r方法
    可以把字符串和數(shù)字簡單地打印出來,而數(shù)組則以括起來的鍵和值得列表形式顯示,并以Array開頭。print_r返回值是布爾型的,參數(shù)是mix類型的,可以是字符串,整形,數(shù)組,對象類print_r() 顯示關(guān)于一個變量的易于理解的信息。如果給出的是 string、integer 或 float,將打印變量值本身。如果給出的是 array,將會按照一定格式顯示鍵和元素。print_r() 對數(shù)組作用后將把數(shù)組的指針移到最后邊。使用 reset() 可讓指針回到開始處。
    $data = ['test1', 'test2', 'test3', 'test' => 'test'];
    print_r($data);//Array ( [0] => test1 [1] => test2 [2] => test3 [test] => test )
  4. var_dump方法
    用于顯示關(guān)于一個或多個表達式的結(jié)構(gòu)信息,包括表達式的類型與值。數(shù)組將遞歸展開值,通過縮進顯示其結(jié)構(gòu)。信息比較詳細,用的較多。
    $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)試]

開發(fā)過程中,有些時候為了測試性能,經(jīng)常需要調(diào)試某段代碼的運行時間或者內(nèi)存占用開銷,系統(tǒng)提供了G方法可以很方便的獲取某個區(qū)間的運行時間和內(nèi)存占用情況。

G('begin','end') 表示統(tǒng)計begin位置到end位置的執(zhí)行時間(單位是秒),begin必須是一個已經(jīng)標記過的位置,如果這個時候end位置還沒被標記過,則會自動把當前位置標記為end標簽,輸出的結(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)計的話,還可以使用G方法進行區(qū)間內(nèi)存開銷統(tǒng)計(單位為kb)

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

[模型調(diào)試]

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

CURD操作如果返回值為false,表示數(shù)據(jù)庫操作發(fā)生錯誤,這個時候就需要使用模型的getDbError方法來查看數(shù)據(jù)庫返回的具體錯誤信息。

   $User = M("User"); // 實例化User對象
   $result = $User->find(1);
   if(false === $result){
       echo $User->getDbError();
   }      
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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