搜尋
首頁php框架ThinkPHP聊聊THINKPHP調試模式及異常處理

下面thinkphp框架教學欄位將介紹如何開啟THINKPHP 調試模式及異常處理,希望對需要的朋友有幫助!

調試模式

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

<?php  // 开启调试模式
 define(&#39;APP_DEBUG&#39;, true);
 // 定义应用目录
 define(&#39;APP_PATH&#39;, &#39;./Application/&#39;);
 // 加载框架入口文件
 require &#39;./ThinkPHP/ThinkPHP.php&#39;;

測試時,開啟DEBUG偵錯模式,  開發模式下,自動產生快取文件,測試時自動呼叫快取的文件,會出錯

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

<?php // 关闭调试模式
define(&#39;APP_DEBUG&#39;, false);
// 定义应用目录
define(&#39;APP_PATH&#39;, &#39;./Application/&#39;);
// 加载框架入口文件
require &#39;./ThinkPHP/ThinkPHP.php&#39;;

調試模式的優點在於:

  • 開啟日誌記錄,任何錯誤訊息和調試資訊都會詳細記錄,以便於調試;
  • 關閉模板緩存,模板修改可以即時生效;
  • 記錄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::r​​ecord() 記錄日誌資訊到記憶體
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調試模式及異常處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:csdn。如有侵權,請聯絡admin@php.cn刪除
如何使用ThinkPHP來構建命令行應用程序?如何使用ThinkPHP來構建命令行應用程序?Mar 12, 2025 pm 05:48 PM

本文展示了使用ThinkPHP的CLI功能來構建命令行應用程序(CLI)。 它強調了最佳實踐,例如模塊化設計,依賴注入和強大的錯誤處理,同時突出了諸如INSU之類的常見陷阱

在無服務器體系結構中使用ThinkPHP的關鍵注意事項是什麼?在無服務器體系結構中使用ThinkPHP的關鍵注意事項是什麼?Mar 18, 2025 pm 04:54 PM

本文討論了在無服務器體系結構中使用ThinkPHP的關鍵注意事項,專注於性能優化,無狀態設計和安全性。它突出了諸如成本效率和可擴展性之類的收益,但也應對挑戰

ThinkPHP依賴性注入容器的高級功能是什麼?ThinkPHP依賴性注入容器的高級功能是什麼?Mar 18, 2025 pm 04:50 PM

ThinkPHP的IOC容器提供了高級功能,例如懶惰加載,上下文綁定和方法注入PHP App中有效依賴性管理的方法。Character計數:159

如何使用ThinkPHP和RabbitMQ構建分佈式任務隊列系統?如何使用ThinkPHP和RabbitMQ構建分佈式任務隊列系統?Mar 18, 2025 pm 04:45 PM

本文概述了使用ThinkPhp和RabbitMQ構建分佈式任務隊列系統,重點是安裝,配置,任務管理和可擴展性。關鍵問題包括確保高可用性,避免常見的陷阱,例如不當

如何防止ThinkPHP中的SQL注入漏洞?如何防止ThinkPHP中的SQL注入漏洞?Mar 14, 2025 pm 01:18 PM

本文討論了通過參數化查詢來防止ThinkPhp中的SQL注入漏洞,避免使用原始SQL,使用ORM,常規更新和正確的錯誤處理。它還涵蓋了確保數據庫查詢和驗證的最佳實踐

ThinkPHP內置測試框架的關鍵功能是什麼?ThinkPHP內置測試框架的關鍵功能是什麼?Mar 18, 2025 pm 05:01 PM

本文討論了ThinkPHP的內置測試框架,突出了其關鍵功能(例如單元和集成測試),以及它如何通過早期的錯誤檢測和改進的代碼質量來增強應用程序可靠性。

ThinkPHP 5和ThinkPHP 6以及何時使用的thinkphp 5之間的關鍵區別是什麼?ThinkPHP 5和ThinkPHP 6以及何時使用的thinkphp 5之間的關鍵區別是什麼?Mar 14, 2025 pm 01:30 PM

本文討論了ThinkPHP 5和6之間的關鍵差異,重點是建築,功能,性能和對遺產升級的適用性。對於傳統項目和舊系統,建議使用ThinkPHP 5,而ThinkPHP 6適合新的PR

在ThinkPHP中處理文件上傳和雲存儲的最佳方法是什麼?在ThinkPHP中處理文件上傳和雲存儲的最佳方法是什麼?Mar 17, 2025 pm 02:28 PM

本文討論了處理文件上傳和集成在ThinkPhp中的雲存儲的最佳實踐,重點是安全性,效率和可擴展性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)