ThinkPHP教程_PHP框架之ThinkPHP(四)【调试模式与日志记录】
2016-08-23 15:07
639 查看
一、调试模式
开启调试模式后,可以看到更加详细的错误信息,调试模式的作用的在于显示或者记录更多的日志信息,以便在开发过程中快速定位和解决问题
只需要在项目配置文件中添加一个'APP_DEBUG'=>true,即可开启
1、开启调试模式后,系统在运行时会首先检查是否定义了项目调试配置文件,如果没有定义则使用系统调试配置文件(这是ThinkPHP为我们定义好的),系统调试配置文件为系统目录->Common->debug.php文件
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/0574140ebfa95d33377ce7920e178c6a.png)
2、在系统调试配置文件中,'DB_FIELDS_CACHE'=>false 即关闭数据表字段缓存,因为在调试模式下考虑到数据表结构会经常变动,所以默认只要开启调试模式就关闭数据表字段缓存
所谓数据表字段缓存,就是ThinkPHP会将整个应用所涉及的表的结构都缓存到应用目录->Runtime->Data->_files目录中,每张表对应一个php文件,文件名就是表名,文件内容是一个记录该表字段信息的数组!也就是说如果开启了该缓存,那么在直接对数据库中的表结构进行的修改是不会反映到表结构缓存文件的,而在用Model对表进行操作的时时是根据表结构缓存文件中的结构信息来的,所以会导致比如新加的一个字段插入不进去数据的问题
关于数据表结构缓存,这里有一个链接
3、项目调试配置文件
在应用目录->Config目录下新建一个debug.php文件,内容格式按照系统调试配置文件,最好是将系统调试配置文件的内容copy过来,然后再对其进行删除、增加或修改
不管是否开启调试模式,都会加载项目配置文件(显然是的,不先加载项目配置文件,怎么知道是否开启了调试模式呢?对吧),如果没有开启调试模式则不会加载调试配置文件(系统/项目调试配置文件)的,而且调试配置文件(系统/项目)会覆盖项目配置文件中的相同项!
文件加载顺序(很重要)如下
系统配置文件---》项目配置文件---》系统调试配置文件 PS,注意,要么是加载系统调试配置文件,要么加载项目调试配置文件,并不会像配置文件
---》项目调试配置文件 那样,首先加载系统配置文件再加载项目配置文件
4、运行状态
开启调试模式后,默认会显示页面的运行状态信息,包括运行时间、数据库读写次数、缓存读写次数、内存开销,例如
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/64c51347333a6f10dc6a55f68988e859.png)
而运行状态信息并非必须得在调试模式下才能显示,也是可以直接在项目配置文件中进行单独配置的,可以配置一项或多项
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/da64d445fc8c20d2ead2eb8706f2dff0.png)
注意,这些信息默认是在模板的最后显示的,但是如果你希望在模板其它地方显示,那么可以通过将{__RUNTIME__}等等模板系统变量放到指定的位置显示
5、页面Trace
页面Trace是ThinkPHP用于开发调试的辅助手段,在系统调试配置文件中是默认开启的
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/b8e28fb82e431c24180b9b084045f7f5.png)
·默认的Trace信息包括如下项
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/cd71c2c6a3ed51cc522fdf68b921f447.png)
·还可以自定义Trace信息
方式一:在应用目录->Config目录下新建一个trace.php文件,内容格式与项目配置文件一样(返回一个Aarry),比如
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/06e7a061fd53c331f5154ea0a2b29c4b.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/8eaba2bec744c616ce11ea82cda2d236.png)
方式二:在动作内通过trace()方法来增加trace信息
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/da84297a435b67dfeb5fc5cad3466ed1.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/dd8def0c6af362c53d211965d33044ff.png)
Trace模板也是可以自定义的,上面所说的是自定义Trace信息,在自定义的Trace模板中的关键性代码如下
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/96ef0626c40f45f53ab48eb7162c57d0.png)
默认的Trace模板是系统目录->Tpl目录->PageTrace.tpl.php文件,通过在项目配置文件中的'TMPL_TRACE_FILE'配置项进行配置,比如说'TMPL_TRACE_FILE'=>APP_PATH.'/Public/trace.php',那么项目目录->Public目录->trace.php文件就是自定义的Trace模板
6、手动输出调试信息(Action调试)
有时候调试模式并不能完全满足我们的需求,而需要手动输出一些调试信息
·手动输出变量信息
除了使用PHP内置的var_dump()函数和print_r()函数之外,还可以使用ThinkPHP提供的对浏览器更加友好的dump()函数
·获取某代码段的运行状态
debug_start($label='')和debug_end($label='')函数,比如说
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/eb84151de4abea6607a772dc7bdc269f.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/fa720397ca59c10c5c424ecc1b9c2f33.png)
·中断程序执行并输出相关信息
halt($mes);输出错误信息并终止程序执行
7、模型调试(Model调试)
在模型中,为了更好的查明错误,经常需要查看下最近使用的sql语句,那么ThinkPHP就提供了getLastsql()方法来输出上次执行的sql语句
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/d414b84cff858f18ea0b066356ca762a.png)
输出结果为 SELECT * FROM think_user WHERE id = 1
8、调试类
更加高级的调试方式是使用调试类Debug,分别有三个静态方法mark()、useTime()、useMemory(),作用分别为标记一个调试位置、返回区间所用时间、返回区间所用内存,测试如下
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/7e7367e9f8e940044cc5811a13a2a73c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/229338321c504a0d187b4931f8e4f110.png)
实际上,细心的同学可能发现用debug_start()和debug_end()所测试的相同代码,在执行时间和使用内存上更小
注意一下,通过Debug类的源码可知,useTime()实际上还有第三个参数
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/d1fabe728daecc41730b920a05e1396c.png)
二、日志记录
日志的处理工作是由系统自动完成的,在开启日志记录的情况下,会记录允许的日志级别的所有日志信息。其中SQL级别日志只有在调试模式开启时才有效!
系统的日志记录由核心的Log类完成,提供了多种方式记录下不同的级别的日志信息
1、开启日志记录
在项目配置文件中,添加'LOG_RECORD'=>true即可开启日志记录。一般在开启日志记录之后,紧接着要指定运行记录的日志级别,通过'LOG_RECORD_LEVEL'=>array('日志级别',...)
2、日志级别
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/d2a84dde3e7bd89f5fd3def14e11faa4.png)
ps,在项目配置文件中指定日志级别的时候,填的是字串而不是常量名
3、日志记录方式(自动记录)
SYSTEM 通过发送到PHP的系统日志目录 Log类中对应的常量名值是0
MAIL 通过邮件方式发送 1
TCP 通过TCP方式发送 2
FILE 通过文件方式记录(默认方式) 3
FILE方式的文件格式
年(简写)_月_日.log 比如16_08_23.log表示2016年8月23日的日志文件
这里所说的都是自动记录日志,自动记录的日志会保存到应用目录->Runtime目录->Logs目录->年(简写)_月_日.log文件中
·可以通过LOG_FILE_SIZE来限制日志文件的大小,超过大小的日志文件就会形成备份文件,备份文件的格式是在当前文件名的前面加上备份的时间戳,例如1189571417-07_09_12.log
·日志文件的内容格式是[时间]日志级别:日志信息
·时间显示格式可动态配置,默认采用的[c],可以改成例如Log::format='[Y-m-d H:i:s]',ps,格式与date()函数的用法一致
4、手动记录
通常日志文件的写入都是自动完成的,如果需要在开发的过程中手动记录日志信息,可以通过Log类来实现
有两种方式
方式一:直接使用Log::write()方法一步到位
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/7a71b04d62269b40ff32d3e5ff0c0bcb.png)
方式二:先使用Log::record()方法将日志写入到内存中,然后再用Log::save()方法将内存中的日志写到磁盘中
开启调试模式后,可以看到更加详细的错误信息,调试模式的作用的在于显示或者记录更多的日志信息,以便在开发过程中快速定位和解决问题
只需要在项目配置文件中添加一个'APP_DEBUG'=>true,即可开启
1、开启调试模式后,系统在运行时会首先检查是否定义了项目调试配置文件,如果没有定义则使用系统调试配置文件(这是ThinkPHP为我们定义好的),系统调试配置文件为系统目录->Common->debug.php文件
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/0574140ebfa95d33377ce7920e178c6a.png)
2、在系统调试配置文件中,'DB_FIELDS_CACHE'=>false 即关闭数据表字段缓存,因为在调试模式下考虑到数据表结构会经常变动,所以默认只要开启调试模式就关闭数据表字段缓存
所谓数据表字段缓存,就是ThinkPHP会将整个应用所涉及的表的结构都缓存到应用目录->Runtime->Data->_files目录中,每张表对应一个php文件,文件名就是表名,文件内容是一个记录该表字段信息的数组!也就是说如果开启了该缓存,那么在直接对数据库中的表结构进行的修改是不会反映到表结构缓存文件的,而在用Model对表进行操作的时时是根据表结构缓存文件中的结构信息来的,所以会导致比如新加的一个字段插入不进去数据的问题
关于数据表结构缓存,这里有一个链接
3、项目调试配置文件
在应用目录->Config目录下新建一个debug.php文件,内容格式按照系统调试配置文件,最好是将系统调试配置文件的内容copy过来,然后再对其进行删除、增加或修改
不管是否开启调试模式,都会加载项目配置文件(显然是的,不先加载项目配置文件,怎么知道是否开启了调试模式呢?对吧),如果没有开启调试模式则不会加载调试配置文件(系统/项目调试配置文件)的,而且调试配置文件(系统/项目)会覆盖项目配置文件中的相同项!
文件加载顺序(很重要)如下
系统配置文件---》项目配置文件---》系统调试配置文件 PS,注意,要么是加载系统调试配置文件,要么加载项目调试配置文件,并不会像配置文件
---》项目调试配置文件 那样,首先加载系统配置文件再加载项目配置文件
4、运行状态
开启调试模式后,默认会显示页面的运行状态信息,包括运行时间、数据库读写次数、缓存读写次数、内存开销,例如
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/64c51347333a6f10dc6a55f68988e859.png)
而运行状态信息并非必须得在调试模式下才能显示,也是可以直接在项目配置文件中进行单独配置的,可以配置一项或多项
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/da64d445fc8c20d2ead2eb8706f2dff0.png)
注意,这些信息默认是在模板的最后显示的,但是如果你希望在模板其它地方显示,那么可以通过将{__RUNTIME__}等等模板系统变量放到指定的位置显示
5、页面Trace
页面Trace是ThinkPHP用于开发调试的辅助手段,在系统调试配置文件中是默认开启的
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/b8e28fb82e431c24180b9b084045f7f5.png)
·默认的Trace信息包括如下项
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/cd71c2c6a3ed51cc522fdf68b921f447.png)
·还可以自定义Trace信息
方式一:在应用目录->Config目录下新建一个trace.php文件,内容格式与项目配置文件一样(返回一个Aarry),比如
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/06e7a061fd53c331f5154ea0a2b29c4b.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/8eaba2bec744c616ce11ea82cda2d236.png)
方式二:在动作内通过trace()方法来增加trace信息
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/da84297a435b67dfeb5fc5cad3466ed1.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/dd8def0c6af362c53d211965d33044ff.png)
Trace模板也是可以自定义的,上面所说的是自定义Trace信息,在自定义的Trace模板中的关键性代码如下
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/96ef0626c40f45f53ab48eb7162c57d0.png)
默认的Trace模板是系统目录->Tpl目录->PageTrace.tpl.php文件,通过在项目配置文件中的'TMPL_TRACE_FILE'配置项进行配置,比如说'TMPL_TRACE_FILE'=>APP_PATH.'/Public/trace.php',那么项目目录->Public目录->trace.php文件就是自定义的Trace模板
6、手动输出调试信息(Action调试)
有时候调试模式并不能完全满足我们的需求,而需要手动输出一些调试信息
·手动输出变量信息
除了使用PHP内置的var_dump()函数和print_r()函数之外,还可以使用ThinkPHP提供的对浏览器更加友好的dump()函数
·获取某代码段的运行状态
debug_start($label='')和debug_end($label='')函数,比如说
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/eb84151de4abea6607a772dc7bdc269f.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/fa720397ca59c10c5c424ecc1b9c2f33.png)
·中断程序执行并输出相关信息
halt($mes);输出错误信息并终止程序执行
7、模型调试(Model调试)
在模型中,为了更好的查明错误,经常需要查看下最近使用的sql语句,那么ThinkPHP就提供了getLastsql()方法来输出上次执行的sql语句
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/d414b84cff858f18ea0b066356ca762a.png)
输出结果为 SELECT * FROM think_user WHERE id = 1
8、调试类
更加高级的调试方式是使用调试类Debug,分别有三个静态方法mark()、useTime()、useMemory(),作用分别为标记一个调试位置、返回区间所用时间、返回区间所用内存,测试如下
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/7e7367e9f8e940044cc5811a13a2a73c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/229338321c504a0d187b4931f8e4f110.png)
实际上,细心的同学可能发现用debug_start()和debug_end()所测试的相同代码,在执行时间和使用内存上更小
注意一下,通过Debug类的源码可知,useTime()实际上还有第三个参数
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/d1fabe728daecc41730b920a05e1396c.png)
二、日志记录
日志的处理工作是由系统自动完成的,在开启日志记录的情况下,会记录允许的日志级别的所有日志信息。其中SQL级别日志只有在调试模式开启时才有效!
系统的日志记录由核心的Log类完成,提供了多种方式记录下不同的级别的日志信息
1、开启日志记录
在项目配置文件中,添加'LOG_RECORD'=>true即可开启日志记录。一般在开启日志记录之后,紧接着要指定运行记录的日志级别,通过'LOG_RECORD_LEVEL'=>array('日志级别',...)
2、日志级别
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/d2a84dde3e7bd89f5fd3def14e11faa4.png)
ps,在项目配置文件中指定日志级别的时候,填的是字串而不是常量名
3、日志记录方式(自动记录)
SYSTEM 通过发送到PHP的系统日志目录 Log类中对应的常量名值是0
MAIL 通过邮件方式发送 1
TCP 通过TCP方式发送 2
FILE 通过文件方式记录(默认方式) 3
FILE方式的文件格式
年(简写)_月_日.log 比如16_08_23.log表示2016年8月23日的日志文件
这里所说的都是自动记录日志,自动记录的日志会保存到应用目录->Runtime目录->Logs目录->年(简写)_月_日.log文件中
·可以通过LOG_FILE_SIZE来限制日志文件的大小,超过大小的日志文件就会形成备份文件,备份文件的格式是在当前文件名的前面加上备份的时间戳,例如1189571417-07_09_12.log
·日志文件的内容格式是[时间]日志级别:日志信息
·时间显示格式可动态配置,默认采用的[c],可以改成例如Log::format='[Y-m-d H:i:s]',ps,格式与date()函数的用法一致
4、手动记录
通常日志文件的写入都是自动完成的,如果需要在开发的过程中手动记录日志信息,可以通过Log类来实现
有两种方式
方式一:直接使用Log::write()方法一步到位
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/7a71b04d62269b40ff32d3e5ff0c0bcb.png)
方式二:先使用Log::record()方法将日志写入到内存中,然后再用Log::save()方法将内存中的日志写到磁盘中
相关文章推荐
- ThinkPHP调试模式与日志记录概述
- ThinkPHP调试模式与日志记录
- ThinkPHP调试模式与日志记录概述
- ThinkPHP调试模式与日志记录
- ThinkPHP 控制器调试与Trace信息 模版替换变量的修改 开启了日志记录
- ThinkPHP教程_PHP框架之ThinkPHP(二)【URL路径访问与模块控制器、URL四种模式、PATHINFO的两种模式、模板与控制器之间的关系】
- ThinkPHP学习笔记(四)调试模式与日志记录
- 如何在ThinkPHP中开启调试模式
- MySQL事务的隔离级别和日志记录模式选择
- 用 NSLog 打印日志,帮助调试程序的教程
- php调试和日志记录函数
- 日志记录模式(LOGGING 、FORCE LOGGING 、NOLOGGING) .
- 怎样开启ThinkPHP3.0的调试模式
- Flex项目调试及日志记录
- linux-0.11调试教程,显示strat minix后不能进入保护模式的原因,看bochsout.txt
- linux debug调试信息的日志记录
- SSIS教程SQlServer2008R2 (4) 添加日志记录 Log
- 日志记录模式(LOGGING 、FORCE LOGGING 、NOLOGGING)
- 日志记录模式(LOGGING 、FORCE LOGGING 、NOLOGGING)
- ADFLogger记录日志和调试ADF业务组件