聊聊THINKPHP偵錯模式及例外處理

2022-01-18 19:00:55
下面教學欄目將給大家介紹關於如何開啟THINKPHP 偵錯模式及例外處理,希望對需要的朋友有所幫助!

偵錯模式

開啟偵錯模式很簡單,只需要在入口檔案中增加一行常數定義程式碼:

<?php
 // 開啟偵錯模式
 define('APP_DEBUG', true);
 // 定義應用目錄
 define('APP_PATH', './Application/');
 // 載入框架入口檔案
 require './ThinkPHP/ThinkPHP.php';

測試時,開啟DEBUG偵錯模式, 開發模式下,自動生成快取檔案,測試時自動呼叫快取的檔案,會出錯

在完成開發階段部署到生產環境後,只需要關閉偵錯模式或者刪除偵錯模式定義程式碼即可切換到部署模式。

<?php
// 關閉偵錯模式
define('APP_DEBUG', false);
// 定義應用目錄
define('APP_PATH', './Application/');
// 載入框架入口檔案
require './ThinkPHP/ThinkPHP.php';

偵錯模式的優勢在於:

  • 開啟紀錄檔記錄,任何錯誤資訊和偵錯資訊都會詳細記錄,便於偵錯;
  • 關閉模板快取,模板修改可以即時生效;
  • 記錄SQL紀錄檔,方便分析SQL;
  • 關閉欄位快取,資料表欄位修改不受快取影響;
  • 嚴格檢查檔案大小寫(即使是Windows平臺),幫助你提前發現Linux部署可能導致的隱患問題;
  • 通過頁面Trace功能更好的偵錯和發現錯誤;

一旦關閉偵錯模式,發生錯誤後不會提示具體的錯誤資訊,如果你仍然希望看到具體的錯誤資訊,那麼可以如下設定:

'SHOW_ERROR_MSG'        =>  true,    // 顯示錯誤資訊

例外處理

偵錯模式下面一旦系統發生嚴重錯誤會自動丟擲異常,也可以用ThinkPHP內建的E方法手動丟擲異常。

E('新增失敗');

也可以支援異常程式碼(預設為0),例如:

E('資訊錄入錯誤',25);

通過設定TMPL_EXCEPTION_FILE設定引數來修改系統預設的異常模板檔案, 例如:

'TMPL_EXCEPTION_FILE' => APP_PATH.'/Public/exception.tpl'

異常模板中可以使用的異常變數有:

$e['file']異常檔名
$e['line'] 異常發生的檔案行數
$e['message'] 異常資訊
$e['trace'] 異常的詳細Trace資訊

丟擲異常後通常會顯示具體的錯誤資訊,如果不想讓使用者看到具體的錯誤資訊,可以設定關閉錯誤資訊的顯示並設定統一的錯誤提示資訊,例如:

'SHOW_ERROR_MSG' =>    false,
'ERROR_MESSAGE'  =>    '發生錯誤

設定ERROR_PAGE引數,把所有異常和錯誤都指向一個統一頁面,從而避免讓使用者看到異常資訊,通常在部署模式下面使用。ERROR_PAGE引數必須是一個完整的URL地址,例如:

'ERROR_PAGE' =>'/Public/error.html'

如果不在當前域名,還可以指定域名:

'ERROR_PAGE' =>'http://www.myDomain.com/Public/error.html'

注意ERROR_PAGE所指向的頁面不能再使用異常的模板變數了。

紀錄檔記錄

預設情況下只是在偵錯模式記錄紀錄檔,要在部署模式開啟紀錄檔記錄,必須在設定中開啟LOG_RECORD引數,以及可以在應用組態檔中設定需要記錄的紀錄檔級別,例如:

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

紀錄檔級別

ThinkPHP對系統的紀錄檔按照級別來分類,包括:

  • EMERG 嚴重錯誤,導致系統崩潰無法使用
  • ALERT 警戒性錯誤, 必須被立即修改的錯誤
  • CRIT 臨界值錯誤, 超過臨界值的錯誤
  • ERR 一般性錯誤
  • WARN 警告性錯誤, 需要發出警告的錯誤
  • NOTICE 通知,程式可以執行但是還不夠完美的錯誤
  • INFO 資訊,程式輸出資訊
  • DEBUG 偵錯,用於偵錯資訊
  • SQL SQL語句,該級別只在偵錯模式開啟時有效

記錄方式

紀錄檔的記錄方式預設是檔案方式,可以通過驅動的方式來擴充套件支援更多的記錄方式。

記錄方式由LOG_TYPE引數設定,例如:

'LOG_TYPE'              =>  'File', // 紀錄檔記錄型別 預設為檔案方式

File方式記錄,對應的驅動檔案位於系統的Library/Think/Log/Driver/File.class.php

手動記錄

一般情況下,系統的紀錄檔記錄是自動的,無需手動記錄,但是某些時候也需要手動記錄紀錄檔資訊,Log類提供了3個方法用於記錄紀錄檔。

方法描述
Log::record()記錄紀錄檔資訊到記憶體
Log::save()把儲存在記憶體中的紀錄檔資訊(用指定的記錄方式)寫入
Log::write()實時寫入一條紀錄檔資訊

由於系統在請求結束後會自動呼叫Log::save方法,所以通常,你只需要呼叫Log::record記錄紀錄檔資訊即可。

預設記錄的紀錄檔級別是ERR,也可以指定紀錄檔級別:

Think\Log::record('測試紀錄檔資訊,這是警告級別','WARN');

record方法只會記錄當前設定允許記錄的紀錄檔級別的資訊,如果應用設定為:

'LOG_LEVEL'  =>'EMERG,ALERT,CRIT,ERR', // 只記錄EMERG ALERT CRIT ERR 錯誤

那麼上面的record方法記錄的紀錄檔資訊會被直接過濾,或者你可以強制記錄:

Think\Log::record('測試紀錄檔資訊,這是警告級別','WARN',true);

採用record方法記錄的紀錄檔資訊不是實時儲存的,如果需要實時記錄的話,可以採用write方法,例如:

Think\Log::write('測試紀錄檔資訊,這是警告級別,並且實時寫入','WARN');

write方法寫入紀錄檔的時候 不受設定的允許紀錄檔級別影響,可以實時寫入任意級別的紀錄檔資訊。

頁面trace

在部署模式下面,顯示的偵錯資訊沒有偵錯模式完整,通常我們建議頁面Trace配合偵錯模式一起使用。

要開啟頁面Trace功能,需要在專案組態檔中設定:

// 顯示頁面Trace資訊
'SHOW_PAGE_TRACE' =>true,

該引數預設為關閉,開啟後並且你的頁面有模板輸出的話,頁面右下角會顯示ThinkPHP的LOGO:

我們看到的LOGO後面的數位就是當前頁面的執行時間(單位是秒) 點選該圖示後,會展開詳細的頁面Trace資訊,如圖:

頁面Trace框架有6個索引標籤,分別是基本、檔案、流程、錯誤、SQL和偵錯,點選不同的索引標籤會切換到不同的Trace資訊視窗。

索引標籤描述
基本當前頁面的基本摘要資訊,例如執行時間、記憶體開銷、檔案載入數、查詢次數等等。
檔案詳細列出當前頁面執行過程中載入的檔案及其大小。
流程會列出當前頁面執行到的行為和相關流程(待完善)。
錯誤當前頁面執行過程中的一些錯誤資訊,包括警告錯誤。
SQL當前頁面執行到的SQL語句資訊。
偵錯開發人員在程式中進行的偵錯輸出。

頁面Trace的索引標籤是可以客製化和擴充套件的,預設的設定為:

'TRACE_PAGE_TABS'=>array(
    'base'=>'基本',
     'file'=>'檔案',
     'think'=>'流程',
     'error'=>'錯誤',
     'sql'=>'SQL',
     'debug'=>'偵錯'
)

把剛才的使用者資訊偵錯輸出到使用者索引標籤,trace方法的用法如下:

trace($user,'使用者資訊','user');

儲存這些trace資訊,我們可以設定PAGE_TRACE_SAVE引數

'PAGE_TRACE_SAVE'=>true

如果不希望儲存所有的索引標籤的資訊,可以設定需要儲存的索引標籤,例如:

'PAGE_TRACE_SAVE' => array('base','file','sql');

Trace方法

頁面Trace只能用於有頁面輸出的情況,但是trace方法可以用在任何情況,而且trace方法可以用於AJAX等操作。

Trace方法的格式:

trace('變數','標籤','級別','是否記錄紀錄檔')

例如:

$info = '測試資訊';
trace($info,'提示');

如果希望把變數偵錯輸出到頁面Trace的某個索引標籤裡面,可以使用:

trace($info,'提示','user');

如果是輸出到ERR索引標籤,並且開啟 'TRACE_EXCEPTION'=>true的話,

trace($info,'錯誤','ERR');

會丟擲異常。 有三種情況下,trace方法會記錄紀錄檔:

  • AJAX請求

  • SHOW_PAGE_TRACE為false,也就是頁面Trace關閉的情況下

  • trace方法的第四個引數為true

斷點偵錯

憑藉強大的頁面Trace資訊功能支援,ThinkPHP可以支援斷點偵錯功能。 我們只需要在不同的位置對某個變數進行trace輸出即可,例如:

 $blog = D("Blog");
 $vo = $blog->create();
 trace($vo,'create vo');
 $vo = $blog->find();
 trace($vo,'find vo');

變數偵錯

輸出某個變數是開發過程中經常會用到的偵錯方法

用法:

dump($var, $echo=true, $label=null, $strict=true)

相關引數的使用如下:

引數描述
var(必須)要輸出的變數,支援所有變數型別
echo(可選)是否直接輸出,預設為true,如果為false則返回但不輸出
label(可選)變數輸出的label標識,預設為空
strict(可選)輸出變數型別,預設為true,如果為false則採用print_r輸出

如果echo引數為false 則返回要輸出的字串

使用範例:

 $Blog = D("Blog");
 $blog = $Blog->find(3);
 dump($blog);

效能偵錯

G方法可以很方便的獲取某個區間的執行時間和記憶體佔用情況。 例如:

G('begin');
// ...其他程式碼段
G('end');
// ...也許這裡還有其他程式碼
// 進行統計區間
echo G('begin','end').'s';

G('begin','end') 表示統計begin位置到end位置的執行時間(單位是秒),begin必須是一個已經標記過的位置,如果這個時候end位置還沒被標記過,則會自動把當前位置標記為end標籤,輸出的結果類似於:0.0056s

預設的統計精度是小數點後4位元,如果覺得這個統計精度不夠,還可以設定例如:

G('begin','end',6).'s';

可能的輸出會變成:0.005587s

如果你的環境支援記憶體佔用統計的話,還可以使用G方法進行區間記憶體開銷統計(單位為kb),例如:

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

第三個引數使用m表示進行記憶體開銷統計,輸出的結果可能是:625kb

錯誤偵錯

如果需要我們可以使用E方法輸出錯誤資訊並中斷執行,例如:

//輸出錯誤資訊,並中止執行
E($msg);

模型偵錯

偵錯執行的SQL語句

在模型操作中 ,為了更好的查明錯誤,經常需要檢視下最近使用的SQL語句,我們可以用getLastsql方法來輸出上次執行的sql語句。例如:

$User = M("User"); // 範例化User物件
$User->find(1);
echo $User->getLastSql();
// 3.2版本中可以使用簡化的方法
echo $User->_sql();

每個模型都使用獨立的最後SQL記錄,互不干擾,但是可以用空模型的getLastSql方法獲取全域性的最後SQL記錄

偵錯資料庫錯誤資訊

在模型操作中,還可以獲取資料庫的錯誤資訊,例如:

$User = M("User"); // 範例化User物件
$result = $User->find(1);
if(false === $result){
    echo $User->getDbError();
}

CURD操作如果返回值為false,表示資料庫操作發生錯誤,這個時候就需要使用模型的getDbError方法來檢視資料庫返回的具體錯誤資訊。

以上就是聊聊THINKPHP偵錯模式及例外處理的詳細內容,更多請關注TW511.COM其它相關文章!