调试方法
一. 调试模式
ThinkPHP 专门为开发过程而设置了调试模式,调试模式开启后,特别方便我们进行排
错和调整。但由于它执行效率会稍低,所以在正式部署项目的时候,关闭调试模式。
1 // 入口文件处,开启调试模式 建议开发阶段开启 部署阶段注释或者设为false 2 define('APP_DEBUG',t t rue);
开启来会告诉你错误的一些具体信息,部署项目后,错误信息是给用户看的,这时不需要列出错误的具体信息在哪
下图为用户看到的错误页面
调试模式在开发中的优势在于:
1.开启日志记录,任何错误和调试信息都会详细记录; 2.关闭模版缓存,模版修改可以及时生效; 3.记录 SQL 日志,方便分析 SQL; 4.关闭字段缓存,数据表字段修改不受缓存影响; 5.严格检查文件大小写,帮助提前发现 Linux 部署问题; 6.通过页面 Trace 功能更好的调试和发现问题。
二. 异常处理
和 PHP 默认的异常处理不同,ThinkPHP 抛出的不单纯的错误信息,而是一个人性化的
错误页面。当然,我们也可以自行调用这种错误信息。
1 //手动抛出异常 2 E('失败!');
这时 E('失败!') 会触发失败,即使其它代码没有错误:
三. 模型调试
在模型操作中,为了更好的查明错误,经常需要查看下最近使用的 SQL 语句。
1 //获取最近的SQL语句 2 echo $user->getLastSql();
1 //查看SQL的错误信息 2 $list = $user->query("SELECT * FROM bbb"); 3 echo $user->getDbError();
输出的错误信息为: 1146:Table 'thinkphp.bbb' doesn't exist [ SQL语句 ] : SELECT * FROM bbb
四. 性能调试
我们可以使用大 G()方法,来测试某段代码的内存开销和运行时间。
1 //包裹要测试的代码 2 G('begin'); 3 $user = D('User'); 4 $list = $user->select(); 5 $this->assign('list', $list); 6 $this->display(); 7 G('end');
1 //计算运行时间,单位秒 2 echo G('begin','end').'s';
1 //计算消耗内存,单位kb 2 echo G('begin','end','m').'kb';
PS:如果你的环境不支持内存消耗测试,它会自动按时间运算。
五. 变量调试
在开发中,我们经常需要对变量进行调试。一般会采用 PHP 自带的 var_dump()
和 print_r 方法,ThinkPHP 内置了一个对浏览器友好的 dump()方法,用于输出变量
信息。
1 //参数1必选,其他可选 2 dump($list, true, null, false);
PS:参数 1 为变量,参数 2 为是否打印,参数 3 标识,参数 4 是否采用 print_r。
第二个参数是为是否将获取的$list数组打印出来
第三个参数,如 dump($list, true, admin, true); ,则打印的结果为:
最后的参数为false时,打印的结果如下:
为true时
六. 日志记录
日志处理是系统自动进行的,在开启日志记录的情况下,会记录下运行的日志级别
的所有日志信息。
一般情况下,SQL 日志级别必须在调试模式下开启有效,否则不会记录。默认情
况下,一般在调试模式下记录日志,如果要在部署模式下开启日志记录,则需要进行配
置。
生成的日志在 WeiBo/Runtime/logs 中。
在 WeiBo/Common/Conf/config.php 中进行配置
1 //部署模式下开启日志记录 2 'LOG_RECORD' => true,
1 //运行的日志记录级别 2 'LOG_LEVEL' =>'EMERG,ALERT,CRIT,ERR',
ThinkPHP 对系统的日志按照级别来分类,包括:
1. EMERG 严重错误,导致系统崩溃无法使用 2. ALERT 警戒性错误, 必须被立即修改的错误 3. CRIT 临界值错误, 超过临界值的错误 4. ERR 一般性错误 5. WARN 警告性错误, 需要发出警告的错误 6. NOTICE 通知,程序可以运行但是还不够完美的错误 7. INFO 信息,程序输出信息 8. DEBUG 调试,用于调试信息 9. SQL SQL 语句,该级别只在调试模式开启时有效
1 //手动写入,第二参数为级别,第三为强制 2 Log:: record('日志','WARN', true)
1 //不受配置文件影响 2 Log:: write ('日志','WARN');
不受配置文件影响的原因是在代码部署时,如果实在开发的情况下,则会
强制的原因是当 define('APP_DEBUG',false); 时,没有调试模式了,默认是不写入日志的,但强制写入还是会写入日志的。
Log:: write 是不管什么情况,还是会写入日志文件里的。
七.Track
ThinkPHP 提供了一个非常方便的调试工具:页面 Track。这个工具必须在调试模式下有效。
1 //页面Trace 2 'SHOW_PAGE_TRACE' => true,
1 //设置要显示的调试模块 2 'TRACE_PAGE_TABS'=> array( 3 'base'=>'基本', 4 'file'=>'文件', 5 'think'=>'流程', 6 'error'=>'错误', 7 'sql'=>'SQL', 8 'debug'=>'调试' 9 ),
1 //调试方法 2 trace('调试方法', '提示', 'user');