# 调试器
Tracy调试器是PHP程序员的有用帮助提示。 它可以帮助程序员很完成以下几点:
* 快速检测和纠正错误
* 日志错误
* 转储变量
* 测量脚本/查询的执行时间
* 内存消耗
## 安装和要求
如何安装Tracy的最好方法是下载最新的软件包或使用Composer:
~~~
php composer.phar require tracy/tracy
~~~
Tracy需要PHP 5.3.0或更高版本。
**我们下载安装包时就已自带了tracy**
## 用法
激活Tracy很容易。 只需添加这两行代码,最好只是加载库(使用require'src / tracy.php'或通过Composer):
~~~
use Tracy\Debugger;
Debugger::enable();
~~~
Tracy一开始是打开的。所以我们开发时打开网站都会看到一个调试器,所以我们不用个修改什么。
## 调试器
调试器栏是一个浮动面板。 它一开始就显示在页面的右下角。 您可以使用鼠标移动它。 它会记住它在页面重新加载后的位置。
![](https://box.kancloud.cn/2ad33c96bab091cd2036f7c37fc68fac_560x68.png)
您可以将其他有用的面板添加到调试器栏中。 你可以在插件中找到有趣的,或者你可以创建自己的面板加入进去。
一般我们就不加了。原有的够用了!
## 可视化的错误和异常
当然,你知道PHP如何报告错误:页面中有这样的源代码:
~~~
Parse error: syntax error, unexpected '}' in HomepagePresenter.php on line 15
~~~
或未捕获异常:
~~~
Fatal error: Uncaught Nette\MemberAccessException: Call to undefined method Nette\Application\UI\Form::addTest()? in /sandbox/vendor/nette/utils/src/Utils/ObjectMixin.php:100
Stack trace:
#0 /sandbox/vendor/nette/utils/src/Utils/Object.php(75): Nette\Utils\ObjectMixin::call(Object(Nette\Application\UI\Form), 'addTest', Array)
#1 /sandbox/app/forms/SignFormFactory.php(32): Nette\Object->__call('addTest', Array)
#2 /sandbox/app/presenters/SignPresenter.php(21): App\Forms\SignFormFactory->create()
#3 /sandbox/vendor/nette/component-model/src/ComponentModel/Container.php(181): App\Presenters\SignPresenter->createComponentSignInForm('signInForm')
#4 /sandbox/vendor/nette/component-model/src/ComponentModel/Container.php(139): Nette\ComponentModel\Container->createComponent('signInForm')
#5 /sandbox/temp/cache/latte/15206b353f351f6bfca2c36cc.php(17): Nette\ComponentModel\Co in /sandbox/vendor/nette/utils/src/Utils/ObjectMixin.php on line 100
~~~
这个输出不是那么容易浏览理解。 如果启用Tracy,则错误和异常都以完全不同的形式显示:
![](https://box.kancloud.cn/d483183e6ec9080f9940bb68a6ba4f28_1064x787.png)
错误消息字面上加提示性显示。 您可以看到源代码的一部分,其中出现错误的突出显示的行。 消息清楚地解释了错误。 整个网站是互动的,你可以试试。
这前的博客实例已试过,大家不明白可以回头看一下。
你知道吗? 致命错误以相同的方式捕获和显示。 无需安装任何扩展(点击即时示例):
![](https://box.kancloud.cn/75971a36a08db73a71b33637fb0f13d7_1064x787.png)
错误(如变量名称中的打字错误或尝试打开不存在的文件)会生成E_NOTICE或E_WARNING级别的报告。 这些可以容易地被忽略和/或可以完全隐藏在网页图形布局中。 让Tracy管理他们:
![](https://box.kancloud.cn/6c8c968d85470fb90d2a4a023312db4b_813x159.png)
或者它们可能显示为错误:
~~~
Debugger::$strictMode = TRUE;
~~~
![](https://box.kancloud.cn/12ec7460fb8f1be448ecb7279b011418_1064x787.png)
## 生产模式和错误日志记录
正如你所看到的,Tracy在开发环境中是相当有说服力的。 但是在生产服务器上它会引起灾难。 任何调试信息都不能在那里列出。 因此,Tracy具有环境自动检测和日志功能。 Tracy不会显示自己,而是将信息存储到日志文件中,并向访问者显示用户可理解的服务器错误消息:
![](https://box.kancloud.cn/edd6e1d1bb68848b7247044cf7303469_1064x787.png)
生产输出模式抑制通过Debugger :: dump()或Debugger :: fireLog()发送的所有调试信息,当然还包括PHP生成的所有错误消息。所以,即使你在源代码中忘记了Debugger :: dump($ obj),你也不必担心它在你的生产服务器上显示出来。
输出模式由Debugger :: enable()的第一个参数设置。您可以指定常数Debugger :: PRODUCTION或Debugger :: DEVELOPMENT。其他选项是以一种方式设置它,当应用程序从定义的IP地址访问具有定义的tracy-debug cookie值时,开发模式将打开。用于实现这一点的语法是cookie-value @ ip-address。
如果未指定,则使用缺省值Debugger :: DETECT。在这种情况下,系统通过IP地址检测服务器。如果通过公共IP地址访问应用程序,则选择生产模式。本地IP地址导致开发模式。在大多数情况下不需要设置模式。在本地服务器或生产环境中启动应用程序时,会正确识别模式。
在生产模式下,Tracy会自动将所有错误和异常捕获到文本日志中。除非另有说明,否则它将存储在log / error.log中。此错误日志记录非常有用。想象一下,你的应用程序的所有用户实际上是betatesters。他们在狩猎虫时自由地做最前沿的工作,如果你把他们有价值的报告丢到一个没有注意到的回收站,你会很蠢。
如果您需要记录自己的消息或捕获异常,请使用方法log():
~~~
Debugger::log('Unexpected error'); // 短信息
try {
criticalOperation();
} catch (Exception $e) {
Debugger::log($e); //日志异常
// 或者
Debugger::log($e, Debugger::ERROR) // 还会发送电子邮件通知
}
~~~
可以通过enable()方法的第二个参数设置错误日志记录的目录:
~~~
Debugger::enable(Debugger::DETECT, __DIR__ . '/mylog');
~~~
如果希望Tracy使用详细信息(HTML报告)记录类似E_NOTICE或E_WARNING的PHP错误,请设置Debugger :: $ logSeverity:
~~~
Debugger::$logSeverity = E_NOTICE | E_WARNING;
~~~
对于一个真正的专业人士,错误日志是一个重要的信息来源,他或她想立即被通知任何新的错误。 Tracy帮助他。 她能够为每个新的错误记录发送电子邮件。 变量$ email标识发送这些电子邮件的位置:
~~~
Debugger::$email = 'admin@example.com';
~~~
为了防止您的电子邮件箱泛洪,Tracy只发送一条消息,并创建一个电子邮件发送的文件。 当开发人员收到电子邮件通知时,他检查日志,更正他的应用程序并删除电子邮件发送的监控文件。 这将再次激活电子邮件发送。
## 变量倾销
每个调试开发人员都是一个很好的朋友,函数var_dump详细列出了任何变量的所有内容。 不幸的是,它的输出没有HTML格式化,并将转储输出到一行HTML代码,更不用说上下文转义。 有必要用一个更方便的函数来替换var_dump。 这就是Debugger :: dump()是什么。
~~~
$arr = [10, 20.2, TRUE, NULL, 'hello'];
dump($arr);
// 或者Tracy\Debugger::dump($arr);
~~~
很明显这个是我们常用的测试变量。
生成输出:
![](https://box.kancloud.cn/9aad97da5f7b660ec069e51ba94cddd8_216x173.png)
您还可以通过Debugger :: $ maxDepth更改嵌套深度,并通过Debugger :: $ maxLen更改显示的字符串长度。 自然地,较低的值加速Tracy渲染。
~~~
Debugger::$maxDepth = 2; // default: 3
Debugger::$maxLen = 50; // default: 150
~~~
dump()函数可以显示其他有用的信息。 Tracy \ Dumper :: LOCATION_SOURCE添加了工具提示和文件的路径,函数被调用。 Tracy \ Dumper :: LOCATION_LINK添加了该文件的链接。 Tracy \ Dumper :: LOCATION_CLASS向包含文件路径的每个转储对象添加一个工具提示,其中定义了对象的类。 所有这些常量可以在调用dump()之前在Debugger :: $ showLocation变量中设置。 您可以使用|一次设置多个值 运算符。
~~~
Debugger::$showLocation = Tracy\Dumper::LOCATION_SOURCE; // Shows path to where the dump() was called
Debugger::$showLocation = Tracy\Dumper::LOCATION_CLASS | Tracy\Dumper::LOCATION_LINK; // Shows both paths to the classes and link to where the dump() was called
Debugger::$showLocation = FALSE; // Hides additional location information
Debugger::$showLocation = TRUE; // Shows all additional location information
~~~
非常方便的替代Debugger :: dump()是Debugger :: barDump()。 这允许我们在Debugger Bar中转储变量。 这是有用的,因为转储不会弄乱输出,我们还可以为转储添加标题。
~~~
Debugger::barDump([2, 4, 6, 8], 'even numbers up to ten');
Debugger::barDump([1, 3, 5, 7, 9], 'odd numbers up to ten');
~~~
![](https://box.kancloud.cn/33fde68af41790aa8a9cc5ebbb64c28c_397x381.png)
定时
另一个有用的工具是调试器秒表,精度为微秒:
~~~
Debugger::timer();
// sweet dreams my cherrie
sleep(2);
$elapsed = Debugger::timer();
// $elapsed = 2
~~~
一次可以通过可选参数实现多个测量。
~~~
Debugger::timer('page-generating');
// some code
Debugger::timer('rss-generating');
// some code
$rssElapsed = Debugger::timer('rss-generating');
$pageElapsed = Debugger::timer('page-generating');
~~~
~~~
Debugger::timer(); // runs the timer
... // some time consuming operation
echo Debugger::timer(); // elapsed time in seconds
~~~
其实这章主要学会看Tracy还有日记,还有dump就可以了。其他的不用去设置,因为安装包什么都帮我们设置好了。只是让大家了解更细的的功能。不过也很少用的得到。
- Nette简介
- 快速开始
- 入门
- 主页
- 显示文章详细页
- 文章评论
- 创建和编辑帖子
- 权限验证
- 程序员指南
- MVC应用程序和控制器
- URL路由
- Tracy - PHP调试器
- 调试器扩展
- 增强PHP语言
- HTTP请求和响应
- 数据库
- 数据库:ActiveRow
- 数据库和表
- Sessions
- 用户授权和权限
- 配置
- 依赖注入
- 获取依赖关系
- DI容器扩展
- 组件
- 字符串处理
- 数组处理
- HTML元素
- 使用URL
- 表单
- 验证器
- 模板
- AJAX & Snippets
- 发送电子邮件
- 图像操作
- 缓存
- 本土化
- Nette Tester - 单元测试
- 与Travis CI的持续集成
- 分页
- 自动加载
- 文件搜索:Finder
- 原子操作