# 调试方法
[上一页](# "上一页")[下一页](# "下一页")
调试模式并不能完全满足我们调试的需要,有时候我们需要手动的输出一些调试信息。除了本身可以借助一些开发工具进行调试外,ThinkPHP还提供了一些内置的调试函数和类库。
### 变量调试
输出某个变量是开发过程中经常会用到的调试方法,除了使用php内置的var_dump和print_r之外,ThinkPHP框架内置了一个对浏览器友好的var_dump方法,用于输出变量的信息到浏览器查看。
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">dump 浏览器友好的变量输出</th></tr><tr><td>用法</td><td>dump($var, $echo=true, $label=null, $strict=true)</td></tr><tr><td>参数</td><td>var(必须):要输出的变量,支持所有变量类型<br/>echo(可选):是否直接输出,默认为true,如果为false则返回但不输出<br/>label(可选):变量输出的label标识,默认为空<br/>strict(可选):输出变量类型,默认为true,如果为false则采用print_r输出</td></tr><tr><td>返回值</td><td>如果echo参数为false 则返回要输出的字符串</td></tr></table>
使用示例:`$Blog = D("Blog");
$blog = $Blog->find(3);
dump($blog);`在浏览器输出的结果是:`array(12) {
["id"] => string(1) "3"
["name"] => string(0) ""
["userId"] => string(1) "0"
["categoryId"] => string(1) "0"
["title"] => string(4) "test"
["content"] => string(4) "test"
["cTime"] => string(1) "0"
["mTime"] => string(1) "0"
["status"] => string(1) "0"
["readCount"] => string(1) "0"
["commentCount"] => string(1) "0"
["tags"] => string(0) ""
}`
### 性能调试
开发过程中,有些时候为了测试性能,经常需要调试某段代码的运行时间或者内存占用开销,系统提供了一些方法可以很方便的获取某个区间的运行时间和内存占用情况。
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">debug_start 区间调试开始(记录初始时间和内存占用)</th></tr><tr><td>用法</td><td>debug_start($label='')</td></tr><tr><td>参数</td><td>label(可选):区间的label标识,默认为空</td></tr><tr><td>返回值</td><td>无</td></tr></table>
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">debug_end 区间调试结束(记录区间结束时间和内存占用 并输出结果)</th></tr><tr><td>用法</td><td>debug_end($label='')</td></tr><tr><td>参数</td><td>label(可选):区间的label标识,默认为空,<br/>必须和debug_start的label对应才能输出正确的区间结果</td></tr><tr><td>返回值</td><td>无</td></tr></table>
注意:debug_start和debug_end 方法中的内存占用输出需要环境支持memory_get_usage方法,否则只会显示时间信息。
使用示例:`debug_start('run');
$blog = D("Blog");
$blog->select();
debug_end('run');`会输出下面的运行信息:`Process run: Times 0.007730s Memories 76 k`如果仅仅需要调试时间开销,还可以使用内置的G函数来更方便实现
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">G 用于记录和统计时间(微秒)</th></tr><tr><td>用法</td><td>G($start,$end='',$dec=4)</td></tr><tr><td>参数</td><td>start(必须):起始位置标识<br/>end(可选):记录结束标记并统计时间<br/>dec(可选):调试时间的统计精度,默认为小数点后4位</td></tr><tr><td>返回值</td><td>如果end为空或者是一个浮点数, 无返回值。<br/>如果end是一个字符串,则返回从start到end位置的使用时间。</td></tr></table>
使用示例:`G('run');
$blog = D("Blog");
$blog->select();
echo G('run','end').'s';`除了上面的 函数外,系统还提供了一个扩展调试类Debug
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">Debug::mark 标记调试位(并记录该位置的时间和内存占用)</th></tr><tr><td>用法</td><td>Debug::mark($name)</td></tr><tr><td>参数</td><td>name(必须):调试标记位的name标识</td></tr><tr><td>返回值</td><td>无</td></tr><tr><th colspan="2">Debug::useTime 统计区间标记调试位的使用时间</th></tr><tr><td>用法</td><td>useTime($start,$end,$decimals = 6)</td></tr><tr><td>参数</td><td>start(必须):调试开始位置标识<br/>end(必须):调试结束位置标识<br/>decimals(精度):调试时间的统计精度默认为小数点后6位</td></tr><tr><td>返回值</td><td>区间位置的使用时间(字符串)</td></tr>[table]<tr><th colspan="2">Debug::useMemory 统计区间标记调试位的内存占用</th></tr><tr><td>用法</td><td>useMemory($start,$end)</td></tr><tr><td>参数</td><td>start(必须):调试开始位置标识<br/>end(必须):调试结束位置标识</td></tr><tr><td>返回值</td><td>区间位置的内存占用(字符串)</td></tr>[table]<tr><th colspan="2">Debug::getMemPeak 统计区间标记调试位的内存占用峰值</th></tr><tr><td>用法</td><td>getMemPeak ($start,$end)</td></tr><tr><td>参数</td><td>start(必须):调试开始位置标识<br/>end(必须):调试结束位置标识</td></tr><tr><td>返回值</td><td>区间位置的内存占用峰值(字符串)</td></tr></table>
要使用Debug类调试的话,首先需要导入Debug类,Debug类位于扩展目录下面的Library/ORG/Util/Debug.class.php ,所以首先要导入:`import('ORG.Util.Debug');
Debug::mark('run');
$blog = D("Blog");
$blog->select();
Debug::mark('end');
echo Debug::useTime('run','end').'s';
echo Debug::useMemory('run','end').'kb';`
### 断点调试
凭借强大的页面Trace信息功能支持,ThinkPHP可以支持断点调试功能。
我们只需要在不同的位置对某个变量进行trace输出即可,例如:`$blog = D("Blog");
$vo = $blog->create();
trace('create vo',$vo);
$vo = $blog->find();
trace('find vo',$vo);`
### 错误调试
如果需要我们可以使用下面的方法输出错误信息并中断执行:
halt($msg)//输出错误信息,并中止执行
### 模型调试
在模型操作中 ,为了更好的查明错误,经常需要查看下最近使用的SQL语句,我们可以用getLastsql方法来输出上次执行的sql语句。例如:`$User = M("User"); // 实例化User对象
$User->find(1);
echo $User->getLastSql();`输出结果是
SELECT * FROM think_user WHERE id = 1
新版每个模型都使用独立的最后SQL记录,互不干扰,但是可以用空模型的getLastSql方法获取全局的最后SQL记录。`$User = M("User"); // 实例化User模型
$Info = M("Info"); // 实例化Info模型
$User->find(1);
$Info->find(2);
echo M()->getLastSql();
echo $User->getLastSql();
echo $Info->getLastSql();`输出结果是
SELECT * FROM think_info WHERE id = 2
SELECT * FROM think_user WHERE id = 1
SELECT * FROM think_info WHERE id = 2
getLastSql方法只能获取最后执行的sql记录,如果需要了解更多的SQL日志,可以通过查看当前的页面Trace或者日志文件。
注意:Mongo数据库驱动由于接口的特殊性,不存在执行SQL的概念,因此SQL日志记录功能是额外封装实现的,所以出于性能考虑,只有在开启调试模式的时候才支持使用getLastSql方法获取最后执行的SQL记录。
[上一页](# "上一页")[下一页](# "下一页")
- 序言
- 1. 入门
- 1.1 简介
- 1.2 基础概念
- 1.3 获取ThinkPHP
- 1.4 环境要求
- 1.5 许可协议
- 1.6 目录结构
- 1.7 命名规范
- 1.8 MVC分层
- 1.9 CBD架构
- 1.10 特性概述
- 1.11 系统流程
- 1.12 开发流程
- 2. 入口
- 2.1 入口文件
- 2.2 项目目录
- 2.3 部署目录
- 2.4 项目编译
- 2.5 调试模式
- 3. 配置
- 3.1 配置格式
- 3.2 惯例配置
- 3.3 项目配置
- 3.4 调试配置
- 3.5 分组配置
- 3.6 读取配置
- 3.7 动态配置
- 3.8 扩展配置
- 4. 函数和类库
- 4.1 函数库
- 4.2 类库
- 5. 控制器
- 5.1 URL模式
- 5.2 模块和操作
- 5.3 定义控制器
- 5.4 空操作
- 5.5 空模块
- 5.6 模块分组
- 5.7 URL伪静态
- 5.8 URL路由
- 5.9 URL重写
- 5.10 URL生成
- 5.11 URL大小写
- 5.12 前置和后置操作
- 5.13 跨模块调用
- 5.14 页面跳转
- 5.15 重定向
- 5.16 获取系统变量
- 5.17 判断请求类型
- 5.18 获取URL参数
- 5.19 AJAX返回
- 5.20 Action参数绑定
- 5.21 多层控制器支持
- 6. 模型
- 6.1 模型定义
- 6.2 模型实例化
- 6.3 字段定义
- 6.4 数据主键
- 6.5 属性访问
- 6.6 跨库操作
- 6.7 连接数据库
- 6.8 切换数据库
- 6.9 分布式数据库
- 6.10 创建数据
- 6.11 字段映射
- 6.12 连贯操作
- 6.13 CURD操作
- 6.14 ActiveRecord
- 6.15 自动验证
- 6.16 命名范围
- 6.17 自动完成
- 6.18 查询语言
- 6.19 查询锁定
- 6.20 字段排除
- 6.21 事务支持
- 6.22 高级模型
- 6.23 视图模型
- 6.24 关联模型
- 6.25 Mongo模型
- 6.26 动态模型
- 6.27 虚拟模型
- 6.28 多层模型支持
- 7. 视图
- 7.1 模板定义
- 7.2 模板赋值
- 7.3 模板输出
- 7.4 模板替换
- 7.5 获取内容
- 7.6 模板引擎
- 7.7 布局模板
- 8. 模板引擎
- 8.1 变量输出
- 8.2 系统变量
- 8.3 使用函数
- 8.4 默认值输出
- 8.5 使用运算符
- 8.6 内置标签
- 8.7 包含文件
- 8.8 导入文件
- 8.9 Volist标签
- 8.10 Foreach标签
- 8.11 For标签
- 8.12 Switch标签
- 8.13 比较标签
- 8.14 三元运算
- 8.15 范围判断标签
- 8.16 Present标签
- 8.17 Empty标签
- 8.18 Defined标签
- 8.19 Define标签
- 8.20 Assign标签
- 8.21 IF标签
- 8.22 标签嵌套
- 8.23 使用PHP代码
- 8.24 模板布局
- 8.25 模板继承
- 8.26 原样输出
- 8.27 模板注释
- 8.28 引入标签库
- 8.29 修改定界符
- 8.30 避免JS混淆
- 9. 日志
- 9.1 日志级别
- 9.2 记录方式
- 9.3 手动记录
- 10. 错误
- 10.1 异常处理
- 10.2 异常模板
- 10.3 异常显示
- 11. 调试
- 11.1 运行状态
- 11.2 页面Trace
- 11.3 调试方法
- 12. 缓存
- 12.1 缓存方式
- 12.2 动态缓存
- 12.3 缓存队列
- 12.4 快捷缓存
- 12.5 快速缓存
- 12.6 查询缓存
- 12.7 SQL解析缓存
- 12.8 静态缓存
- 13. 扩展
- 13.1 行为扩展
- 13.2 类库扩展
- 13.3 控制器扩展
- 13.4 模型扩展
- 13.5 驱动扩展
- 13.6 Widget扩展
- 13.7 模式扩展
- 13.8 引擎扩展
- 14. 安全
- 14.1 表单令牌
- 14.2 字段类型验证
- 14.3 防止SQL注入
- 14.4 输入过滤
- 14.5 上传安全
- 14.6 防止XSS攻击
- 14.7 其他安全建议
- 14.8 目录安全文件
- 14.9 保护模板文件
- 15. 性能
- 15.1 关闭调试模式
- 15.2 开启缓存
- 15.3 合并字段缓存
- 15.4 优化SQL
- 15.5 替换入口
- 15.6 前端优化
- 16. 部署
- 16.1 PATH_INFO支持
- 16.2 隐藏index.php
- 16.3 二级域名部署
- 16.4 定制错误页面
- 16.5 设置时区
- 17. SAE支持
- 17.1 SAE介绍
- 17.2 获取SAE
- 17.3 SAE开发
- 18. REST支持
- 18.1 REST介绍
- 18.2 REST模式
- 18.3 REST配置
- 18.4 REST路由
- 18.5 REST方法
- 19. 杂项
- 19.1 Session支持
- 19.2 Cookie支持
- 19.3 日期和时间
- 19.4 WML开发
- 19.5 多语言
- 19.6 数据分页
- 19.7 文件上传
- 19.8 验证码
- 19.9 图片添加水印
- 19.10 IP获取和定位
- 20. 附录
- 20.1 常量参考
- 20.2 配置参考
- 20.3 关于升级
- 20.4 大事记
- 鸣谢
- 关于