下面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';
調試模式的優點在於:
'SHOW_ERROR_MSG' => true, // 显示错误信息
E('新增失败');
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 错误
日誌的記錄方式預設是檔案方式,可以透過驅動的方式來擴展支援更多的記錄方式。
記錄方式由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調試模式及異常處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!