💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 调试器 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就可以了。其他的不用去设置,因为安装包什么都帮我们设置好了。只是让大家了解更细的的功能。不过也很少用的得到。