溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

THINKPHP調(diào)試模式及異常處理的方法是什么

發(fā)布時(shí)間:2022-01-19 09:08:08 來源:億速云 閱讀:137 作者:iii 欄目:編程語言

這篇文章主要講解了“THINKPHP調(diào)試模式及異常處理的方法是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“THINKPHP調(diào)試模式及異常處理的方法是什么”吧!

調(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ò)誤

日志級(jí)別

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。

手動(dòng)記錄

一般情況下,系統(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í)別的日志信息。

頁面trace

在部署模式下面,顯示的調(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方法可以用在任何情況,而且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

斷點(diǎn)調(diào)試

憑借強(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');

變量調(diào)試

輸出某個(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);

性能調(diào)試

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

錯(cuò)誤調(diào)試

如果需要我們可以使用E方法輸出錯(cuò)誤信息并中斷執(zhí)行,例如:

//輸出錯(cuò)誤信息,并中止執(zhí)行
E($msg);

模型調(diào)試

調(diào)試執(zhí)行的SQL語句

在模型操作中 ,為了更好的查明錯(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記錄

調(diào)試數(shù)據(jù)庫錯(cuò)誤信息

在模型操作中,還可以獲取數(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)注!

向AI問一下細(xì)節(jié)

免責(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)容。

AI