您好,登錄后才能下訂單哦!
這篇文章主要講解了“THINKPHP調試模式及異常處理的方法是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“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信息 '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方法可以用于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語句,我們可以用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調試模式及異常處理的方法是什么”的內容了,經過本文的學習后,相信大家對THINKPHP調試模式及異常處理的方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。