您好,登錄后才能下訂單哦!
這篇文章主要講解了“THINKPHP調(diào)試模式及異常處理的方法是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“THINKPHP調(diào)試模式及異常處理的方法是什么”吧!
開啟調(diào)試模式很簡單,只需要在入口文件中增加一行常量定義代碼:
<?php // 開啟調(diào)試模式 define('APP_DEBUG', true); // 定義應(yīng)用目錄 define('APP_PATH', './Application/'); // 加載框架入口文件 require './ThinkPHP/ThinkPHP.php';
測試時(shí),開啟DEBUG調(diào)試模式, 開發(fā)模式下,自動(dòng)生成緩存文件,測試時(shí)自動(dòng)調(diào)用緩存的文件,會(huì)出錯(cuò)
在完成開發(fā)階段部署到生產(chǎn)環(huán)境后,只需要關(guān)閉調(diào)試模式或者刪除調(diào)試模式定義代碼即可切換到部署模式。
<?php // 關(guān)閉調(diào)試模式 define('APP_DEBUG', false); // 定義應(yīng)用目錄 define('APP_PATH', './Application/'); // 加載框架入口文件 require './ThinkPHP/ThinkPHP.php';
調(diào)試模式的優(yōu)勢(shì)在于:
開啟日志記錄,任何錯(cuò)誤信息和調(diào)試信息都會(huì)詳細(xì)記錄,便于調(diào)試;
關(guān)閉模板緩存,模板修改可以即時(shí)生效;
記錄SQL日志,方便分析SQL;
關(guān)閉字段緩存,數(shù)據(jù)表字段修改不受緩存影響;
嚴(yán)格檢查文件大小寫(即使是Windows平臺(tái)),幫助你提前發(fā)現(xiàn)Linux部署可能導(dǎo)致的隱患問題;
通過頁面Trace功能更好的調(diào)試和發(fā)現(xiàn)錯(cuò)誤;
一旦關(guān)閉調(diào)試模式,發(fā)生錯(cuò)誤后不會(huì)提示具體的錯(cuò)誤信息,如果你仍然希望看到具體的錯(cuò)誤信息,那么可以如下設(shè)置:
'SHOW_ERROR_MSG' => true, // 顯示錯(cuò)誤信息
調(diào)試模式下面一旦系統(tǒng)發(fā)生嚴(yán)重錯(cuò)誤會(huì)自動(dòng)拋出異常,也可以用ThinkPHP內(nèi)置的E方法手動(dòng)拋出異常。
E('新增失敗');
也可以支持異常代碼(默認(rèn)為0),例如:
E('信息錄入錯(cuò)誤',25);
通過設(shè)置TMPL_EXCEPTION_FILE配置參數(shù)來修改系統(tǒng)默認(rèn)的異常模板文件, 例如:
'TMPL_EXCEPTION_FILE' => APP_PATH.'/Public/exception.tpl'
異常模板中可以使用的異常變量有:
$e['file']異常文件名 $e['line'] 異常發(fā)生的文件行數(shù) $e['message'] 異常信息 $e['trace'] 異常的詳細(xì)Trace信息
拋出異常后通常會(huì)顯示具體的錯(cuò)誤信息,如果不想讓用戶看到具體的錯(cuò)誤信息,可以設(shè)置關(guān)閉錯(cuò)誤信息的顯示并設(shè)置統(tǒng)一的錯(cuò)誤提示信息,例如:
'SHOW_ERROR_MSG' => false, 'ERROR_MESSAGE' => '發(fā)生錯(cuò)誤
配置ERROR_PAGE參數(shù),把所有異常和錯(cuò)誤都指向一個(gè)統(tǒng)一頁面,從而避免讓用戶看到異常信息,通常在部署模式下面使用。ERROR_PAGE參數(shù)必須是一個(gè)完整的URL地址,例如:
'ERROR_PAGE' =>'/Public/error.html'
如果不在當(dāng)前域名,還可以指定域名:
'ERROR_PAGE' =>'http://www.myDomain.com/Public/error.html'
注意ERROR_PAGE所指向的頁面不能再使用異常的模板變量了。
默認(rèn)情況下只是在調(diào)試模式記錄日志,要在部署模式開啟日志記錄,必須在配置中開啟LOG_RECORD
參數(shù),以及可以在應(yīng)用配置文件中配置需要記錄的日志級(jí)別,例如:
'LOG_RECORD' => true, // 開啟日志記錄 'LOG_LEVEL' =>'EMERG,ALERT,CRIT,ERR', // 只記錄EMERG ALERT CRIT ERR 錯(cuò)誤
ThinkPHP對(duì)系統(tǒng)的日志按照級(jí)別來分類,包括:
EMERG 嚴(yán)重錯(cuò)誤,導(dǎo)致系統(tǒng)崩潰無法使用
ALERT 警戒性錯(cuò)誤, 必須被立即修改的錯(cuò)誤
CRIT 臨界值錯(cuò)誤, 超過臨界值的錯(cuò)誤
ERR 一般性錯(cuò)誤
WARN 警告性錯(cuò)誤, 需要發(fā)出警告的錯(cuò)誤
NOTICE 通知,程序可以運(yùn)行但是還不夠完美的錯(cuò)誤
INFO 信息,程序輸出信息
DEBUG 調(diào)試,用于調(diào)試信息
SQL SQL語句,該級(jí)別只在調(diào)試模式開啟時(shí)有效
日志的記錄方式默認(rèn)是文件方式,可以通過驅(qū)動(dòng)的方式來擴(kuò)展支持更多的記錄方式。
記錄方式由LOG_TYPE參數(shù)配置,例如:
'LOG_TYPE' => 'File', // 日志記錄類型 默認(rèn)為文件方式
File方式記錄,對(duì)應(yīng)的驅(qū)動(dòng)文件位于系統(tǒng)的
Library/Think/Log/Driver/File.class.php
。
一般情況下,系統(tǒng)的日志記錄是自動(dòng)的,無需手動(dòng)記錄,但是某些時(shí)候也需要手動(dòng)記錄日志信息,Log類提供了3個(gè)方法用于記錄日志。
方法 | 描述 |
---|---|
Log::record() | 記錄日志信息到內(nèi)存 |
Log::save() | 把保存在內(nèi)存中的日志信息(用指定的記錄方式)寫入 |
Log::write() | 實(shí)時(shí)寫入一條日志信息 |
由于系統(tǒng)在請(qǐng)求結(jié)束后會(huì)自動(dòng)調(diào)用Log::save方法,所以通常,你只需要調(diào)用Log::record記錄日志信息即可。
默認(rèn)記錄的日志級(jí)別是ERR,也可以指定日志級(jí)別:
Think\Log::record('測試日志信息,這是警告級(jí)別','WARN');
record方法只會(huì)記錄當(dāng)前配置允許記錄的日志級(jí)別的信息,如果應(yīng)用配置為:
'LOG_LEVEL' =>'EMERG,ALERT,CRIT,ERR', // 只記錄EMERG ALERT CRIT ERR 錯(cuò)誤
那么上面的record方法記錄的日志信息會(huì)被直接過濾,或者你可以強(qiáng)制記錄:
Think\Log::record('測試日志信息,這是警告級(jí)別','WARN',true);
采用record方法記錄的日志信息不是實(shí)時(shí)保存的,如果需要實(shí)時(shí)記錄的話,可以采用write方法,例如:
Think\Log::write('測試日志信息,這是警告級(jí)別,并且實(shí)時(shí)寫入','WARN');
write方法寫入日志的時(shí)候 不受配置的允許日志級(jí)別影響,可以實(shí)時(shí)寫入任意級(jí)別的日志信息。
在部署模式下面,顯示的調(diào)試信息沒有調(diào)試模式完整,通常我們建議頁面Trace配合調(diào)試模式一起使用。
要開啟頁面Trace功能,需要在項(xiàng)目配置文件中設(shè)置:
// 顯示頁面Trace信息 'SHOW_PAGE_TRACE' =>true,
該參數(shù)默認(rèn)為關(guān)閉,開啟后并且你的頁面有模板輸出的話,頁面右下角會(huì)顯示ThinkPHP的LOGO:
我們看到的LOGO后面的數(shù)字就是當(dāng)前頁面的執(zhí)行時(shí)間(單位是秒) 點(diǎn)擊該圖標(biāo)后,會(huì)展開詳細(xì)的頁面Trace信息,如圖:
頁面Trace框架有6個(gè)選項(xiàng)卡,分別是基本、文件、流程、錯(cuò)誤、SQL和調(diào)試,點(diǎn)擊不同的選項(xiàng)卡會(huì)切換到不同的Trace信息窗口。
選項(xiàng)卡 | 描述 |
---|---|
基本 | 當(dāng)前頁面的基本摘要信息,例如執(zhí)行時(shí)間、內(nèi)存開銷、文件加載數(shù)、查詢次數(shù)等等。 |
文件 | 詳細(xì)列出當(dāng)前頁面執(zhí)行過程中加載的文件及其大小。 |
流程 | 會(huì)列出當(dāng)前頁面執(zhí)行到的行為和相關(guān)流程(待完善)。 |
錯(cuò)誤 | 當(dāng)前頁面執(zhí)行過程中的一些錯(cuò)誤信息,包括警告錯(cuò)誤。 |
SQL | 當(dāng)前頁面執(zhí)行到的SQL語句信息。 |
調(diào)試 | 開發(fā)人員在程序中進(jìn)行的調(diào)試輸出。 |
頁面Trace的選項(xiàng)卡是可以定制和擴(kuò)展的,默認(rèn)的配置為:
'TRACE_PAGE_TABS'=>array( 'base'=>'基本', 'file'=>'文件', 'think'=>'流程', 'error'=>'錯(cuò)誤', 'sql'=>'SQL', 'debug'=>'調(diào)試' )
把剛才的用戶信息調(diào)試輸出到用戶選項(xiàng)卡,trace方法的用法如下:
trace($user,'用戶信息','user');
保存這些trace信息,我們可以配置PAGE_TRACE_SAVE
參數(shù)
'PAGE_TRACE_SAVE'=>true
如果不希望保存所有的選項(xiàng)卡的信息,可以設(shè)置需要保存的選項(xiàng)卡,例如:
'PAGE_TRACE_SAVE' => array('base','file','sql');
頁面Trace只能用于有頁面輸出的情況,但是trace方法可以用在任何情況,而且trace方法可以用于AJAX等操作。
Trace方法的格式:
trace('變量','標(biāo)簽','級(jí)別','是否記錄日志')
例如:
$info = '測試信息'; trace($info,'提示');
如果希望把變量調(diào)試輸出到頁面Trace的某個(gè)選項(xiàng)卡里面,可以使用:
trace($info,'提示','user');
如果是輸出到ERR選項(xiàng)卡,并且開啟 'TRACE_EXCEPTION'=>true
的話,
trace($info,'錯(cuò)誤','ERR');
會(huì)拋出異常。 有三種情況下,trace方法會(huì)記錄日志:
AJAX請(qǐng)求
SHOW_PAGE_TRACE為false,也就是頁面Trace關(guān)閉的情況下
trace方法的第四個(gè)參數(shù)為true
憑借強(qiáng)大的頁面Trace信息功能支持,ThinkPHP可以支持?jǐn)帱c(diǎn)調(diào)試功能。 我們只需要在不同的位置對(duì)某個(gè)變量進(jìn)行trace輸出即可,例如:
$blog = D("Blog"); $vo = $blog->create(); trace($vo,'create vo'); $vo = $blog->find(); trace($vo,'find vo');
輸出某個(gè)變量是開發(fā)過程中經(jīng)常會(huì)用到的調(diào)試方法
用法:
dump($var, $echo=true, $label=null, $strict=true)
相關(guān)參數(shù)的使用如下:
參數(shù) | 描述 |
---|---|
var(必須) | 要輸出的變量,支持所有變量類型 |
echo(可選) | 是否直接輸出,默認(rèn)為true,如果為false則返回但不輸出 |
label(可選) | 變量輸出的label標(biāo)識(shí),默認(rèn)為空 |
strict(可選) | 輸出變量類型,默認(rèn)為true,如果為false則采用print_r輸出 |
如果echo參數(shù)為false 則返回要輸出的字符串
使用示例:
$Blog = D("Blog"); $blog = $Blog->find(3); dump($blog);
G方法可以很方便的獲取某個(gè)區(qū)間的運(yùn)行時(shí)間和內(nèi)存占用情況。 例如:
G('begin'); // ...其他代碼段 G('end'); // ...也許這里還有其他代碼 // 進(jìn)行統(tǒng)計(jì)區(qū)間 echo G('begin','end').'s';
G('begin','end') 表示統(tǒng)計(jì)begin位置到end位置的執(zhí)行時(shí)間(單位是秒),begin必須是一個(gè)已經(jīng)標(biāo)記過的位置,如果這個(gè)時(shí)候end位置還沒被標(biāo)記過,則會(huì)自動(dòng)把當(dāng)前位置標(biāo)記為end標(biāo)簽,輸出的結(jié)果類似于:0.0056s
默認(rèn)的統(tǒng)計(jì)精度是小數(shù)點(diǎn)后4位,如果覺得這個(gè)統(tǒng)計(jì)精度不夠,還可以設(shè)置例如:
G('begin','end',6).'s';
可能的輸出會(huì)變成:0.005587s
如果你的環(huán)境支持內(nèi)存占用統(tǒng)計(jì)的話,還可以使用G方法進(jìn)行區(qū)間內(nèi)存開銷統(tǒng)計(jì)(單位為kb),例如:
echo G('begin','end','m').'kb';
第三個(gè)參數(shù)使用m表示進(jìn)行內(nèi)存開銷統(tǒng)計(jì),輸出的結(jié)果可能是:625kb
如果需要我們可以使用E方法輸出錯(cuò)誤信息并中斷執(zhí)行,例如:
//輸出錯(cuò)誤信息,并中止執(zhí)行 E($msg);
在模型操作中 ,為了更好的查明錯(cuò)誤,經(jīng)常需要查看下最近使用的SQL語句,我們可以用getLastsql
方法來輸出上次執(zhí)行的sql語句。例如:
$User = M("User"); // 實(shí)例化User對(duì)象 $User->find(1); echo $User->getLastSql(); // 3.2版本中可以使用簡化的方法 echo $User->_sql();
每個(gè)模型都使用獨(dú)立的最后SQL記錄,互不干擾,但是可以用空模型的getLastSql方法獲取全局的最后SQL記錄
在模型操作中,還可以獲取數(shù)據(jù)庫的錯(cuò)誤信息,例如:
$User = M("User"); // 實(shí)例化User對(duì)象 $result = $User->find(1); if(false === $result){ echo $User->getDbError(); }
CURD操作如果返回值為false,表示數(shù)據(jù)庫操作發(fā)生錯(cuò)誤,這個(gè)時(shí)候就需要使用模型的getDbError方法來查看數(shù)據(jù)庫返回的具體錯(cuò)誤信息。
感謝各位的閱讀,以上就是“THINKPHP調(diào)試模式及異常處理的方法是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)THINKPHP調(diào)試模式及異常處理的方法是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。