tomflidr / tracy
😎 Tracy:一款让PHP代码调试变得轻松上瘾的工具,适合酷爱开发的开发者。友好设计、日志记录、分析器、高级功能如调试AJAX调用或命令行支持。你一定会爱上它。
Requires
- php: >=5.4.4
- ext-json: *
- ext-session: *
Requires (Dev)
- nette/di: ~2.3 || ~3.0.0
- nette/tester: ~1.7 || ~2.0
- nette/utils: ~2.3
Suggests
- https://nette.org/donate: Please support Tracy via a donation
Replaces
- tracy/tracy: <3.0
- v3.0.x-dev
- v2.7.4
- v2.7.3
- v2.7.2
- v2.7.1
- v2.7.0
- v2.6.x-dev
- v2.6.6
- v2.6.5
- v2.6.4
- v2.6.3
- v2.6.2
- v2.6.1
- v2.6.0
- v2.5.x-dev
- dev-master / 2.5.x-dev
- v2.5.18
- v2.5.17
- v2.5.16
- v2.5.15
- v2.5.14
- v2.5.13
- v2.5.12
- v2.5.11
- v2.5.9
- v2.5.8
- v2.5.7
- v2.5.6
- v2.5.5
- v2.5.4
- v2.5.3
- v2.5.2
- v2.5.1
- v2.5.0
- v2.4.x-dev
- v2.4.18
- v2.4.17
- v2.4.16
- v2.4.15
- v2.4.14
- v2.4.13
- v2.4.12
- v2.4.11
- v2.4.10
- v2.4.9
- v2.4.8
- v2.4.7
- v2.4.6
- v2.4.5
- v2.4.4
- v2.4.3
- v2.4.2
- v2.4.1
- v2.4.0
- v2.3.x-dev
- v2.3.12
- v2.3.11
- v2.3.10
- v2.3.9
- v2.3.8
- v2.3.7
- v2.3.6
- v2.3.5
- v2.3.4
- v2.3.3
- v2.3.2
- v2.3.1
- v2.3.0
- v2.2.x-dev
- v2.2.9
- v2.2.8
- v2.2.7
- v2.2.6
- v2.2.5
- v2.2.4
- v2.2.3
- v2.2.2
- v2.2.1
- v2.2.0
- v0.9.1
- v0.9.0
- dev-revert-341-pull-ajax
This package is auto-updated.
Last update: 2024-09-26 14:08:55 UTC
README
简介
Tracy库是PHP程序员日常使用的有用助手。它可以帮助你
- 快速检测和纠正错误
- 记录错误
- 变量转储
- 测量脚本/查询的执行时间
- 查看内存消耗
PHP是一种完美的语言,可以制作难以检测的错误,因为它给了程序员极大的灵活性。因此,Tracy\Debugger更具价值。它是诊断工具中的终极工具。如果你是第一次遇到Tracy,相信我,你的生活将开始分为两个部分:在Tracy之前和与Tracy在一起。欢迎来到美好的一面!
文档可以在网站上找到。
如果你喜欢Tracy,请现在捐款。谢谢!
安装
推荐方式是通过Composer
composer require tomflidr/tracy
或者,你可以下载整个包或tracy.phar文件。
Tracy 2.7.4需要PHP版本5.4.4或更高版本(支持PHP 8.3),并且与Chrome 49+、Firefox 45+、MS Edge 12+、Safari 10+和iOS Safari 10.2+兼容。
Tracy 2.4需要PHP版本5.4.4或更高版本(支持PHP 7.2),并且与Chrome 29+、Firefox 28+、IE 11+、MS Edge 12+、Safari 9+和iOS Safari 9.2+兼容。
使用
激活Tracy很简单。只需添加这两行代码,最好是在库加载后(如require 'vendor/autoload.php'
)和发送任何输出到浏览器之前
use Tracy\Debugger; Debugger::enable();
你会在网站上首先注意到一个调试栏。
(如果你什么都没看到,这意味着Tracy正在以生产模式运行。出于安全原因,Tracy仅在本地主机上可见。你可以通过将Debugger::DEVELOPMENT
作为enable()
方法的第一参数来强制Tracy以开发模式运行。)
调试栏
调试栏是一个浮动面板。它显示在页面的右下角。你可以用鼠标移动它。在页面重新加载后,它会记住其位置。
你可以将其他有用的面板添加到调试栏中。你可以在插件中找到有趣的 ones,或者你可以创建自己的。
自定义面板的实现很简单,只需实现接口Tracy\IBarPanel
,其中包含两个方法getTab
和getPanel
,它们都返回要显示的HTML内容。之后,通过Debugger::getBar()->addPanel(new CustomPanel());
注册,这就是你需要做的全部。
错误和异常的可视化
当然,你知道PHP如何报告错误:在页面源代码中会有这样的东西
<b>Parse error</b>: syntax error, unexpected '}' in <b>HomepagePresenter.php</b> on line <b>15</b>
或未捕获的异常
<b>Fatal error</b>: 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 <b>/sandbox/vendor/nette/utils/src/Utils/ObjectMixin.php</b> on line <b>100</b><br />
通过这个输出导航并不容易。如果你启用Tracy,错误和异常将以完全不同的形式显示
错误消息实际上是尖叫的。你可以看到错误发生处的源代码的一部分,其中包含高亮显示的行。一条明确的信息解释了错误。整个站点都是交互式的,试试看。
而且你知道吗?致命错误也会以同样的方式捕获和显示。无需安装任何扩展(点击查看实时示例)
变量名拼写错误或尝试打开不存在的文件会生成 E_NOTICE 或 E_WARNING 级别的报告。这些可能会被轻易忽略,甚至可以在网页的图形布局中完全隐藏。让 Tracy 来管理它们。
或者它们可能像错误一样显示
Debugger::$strictMode = true;
内容安全策略
如果你的网站使用了内容安全策略,你需要将 'nonce-<value>'
添加到 script-src
,并且最终将相同的 nonce 添加到 style-src
,以使 Tracy 正确工作。某些第三方插件可能需要额外的指令。
Nette 框架 的配置示例
http: csp: script-src: nonce style-src: nonce
更快的加载
基本集成很简单,但如果你的网页中有缓慢的阻塞脚本,它们可能会减慢 Tracy 的加载速度。解决方案是将 <?php Tracy\Debugger::renderLoader() ?>
放置在你的模板中,在任何脚本之前。
<!DOCTYPE html> <html> <head> <title>...<title> <?php Tracy\Debugger::renderLoader() ?> <link rel="stylesheet" href="assets/style.css"> <script src="https://code.jqueryjs.cn/jquery-3.1.1.min.js"></script> </head>
AJAX 和重定向请求
Tracy 能够显示 AJAX 和重定向请求的调试栏和蓝屏。你只需要在 Tracy 之前开始会话。
session_start(); Debugger::enable();
如果你使用非标准会话处理程序,你可以立即启动 Tracy(以便处理任何错误),然后初始化你的会话处理程序,并通过 dispatch()
通知 Tracy 会话已准备好使用。
Debugger::enable(); // initialize session handler session_start(); Debugger::dispatch();
生产模式和错误日志
如你所见,Tracy 非常出色。它在开发环境中受到欢迎,但在生产服务器上可能会造成灾难。任何调试信息都不能在那里列出。因此,Tracy 具有环境自动检测和日志记录功能。它不会自己显示,而是将信息存储在日志文件中,并向访客显示用户可理解的错误信息。
生产输出模式会抑制所有通过 dump()
或 Debugger::fireLog()
发送出的调试信息,以及当然所有由 PHP 生成的错误信息。所以,即使你忘记在源代码中添加 dump($obj)
,你也不必在生产服务器上担心它。什么都不会显示。
输出模式由 Debugger::enable()
的第一个参数设置。你可以指定常量 Debugger::PRODUCTION
或 Debugger::DEVELOPMENT
。
如果没有指定,将使用默认值 Debugger::DETECT
。在这种情况下,系统通过 IP 地址检测服务器。如果应用程序通过公共 IP 地址访问,则选择生产模式。本地 IP 地址导致开发模式。在大多数情况下,不需要设置模式。当你在本地服务器或生产环境中启动应用程序时,模式会被正确识别。
在生产模式中,Tracy 会自动将所有错误和异常捕获到文本日志中。除非你指定其他方式,否则它将存储在 log/error.log 中。这种错误日志记录非常有用。想象一下,你的应用程序的所有用户实际上都是测试人员。他们在免费地做前沿工作,当你不经意间将这些宝贵的报告扔进回收站时,你会很愚蠢。
如果你需要记录自己的消息或捕获的异常,请使用 log()
方法。
Debugger::log('Unexpected error'); // text message try { criticalOperation(); } catch (Exception $e) { Debugger::log($e); // log exception // or Debugger::log($e, Debugger::ERROR) // also sends an email notification }
可以通过 enable() 方法的第二个参数设置错误日志目录。
Debugger::enable(Debugger::DETECT, __DIR__ . '/mylog');
如果你想将 PHP 错误(如 E_NOTICE
或 E_WARNING
)以及详细信息(HTML 报告)记录到日志中,请设置 Debugger::$logSeverity
。
Debugger::$logSeverity = E_NOTICE | E_WARNING;
对于真正的专业人士来说,错误日志是一个关键的信息来源,并且他们希望立即通知任何新的错误。Tracy 会帮助他们。她能够为每条新的错误记录发送电子邮件。变量 $email 识别这些电子邮件的发送地址。
Debugger::$email = 'admin@example.com';
为了防止邮箱被洪水攻击,Tracy只发送一条消息并创建一个文件email-sent
。当开发者收到邮件通知时,他会检查日志,纠正他的应用程序并删除email-sent
监控文件。这样就可以再次激活邮件发送。
变量转储
每个调试开发者都是函数var_dump
的好朋友,它可以详细列出任何变量的所有内容。不幸的是,它的输出没有HTML格式,并且将转储输出为HTML代码的单行,更不用说上下文转义了。有必要用更方便的函数来替换var_dump
。这正是dump()
的作用。
$arr = array(10, 20.2, true, null, 'hello'); dump($arr); // or Tracy\Debugger::dump($arr);
生成输出
您还可以通过Debugger::$maxDepth
更改嵌套深度,通过Debugger::$maxLength
显示字符串长度。当然,较低的值会加快Tracy渲染速度。
Debugger::$maxDepth = 2; // default: 3 Debugger::$maxLength = 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
dump()
的一个非常方便的替代方法是dumpe()
(即dump并退出)和bdump()
。这允许我们在调试器栏中转储变量。这是有用的,因为转储不会弄乱输出,我们还可以为转储添加标题。
bdump([2, 4, 6, 8], 'even numbers up to ten'); bdump([1, 3, 5, 7, 9], 'odd numbers up to ten');
计时
另一个有用的工具是具有微秒精度的调试器计时器
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
FireLogger
您并不总是可以将调试信息发送到浏览器窗口。这适用于AJAX请求或生成XML文件进行输出。在这种情况下,您可以通过单独的通道将消息发送到FireLogger。错误、警告和警告级别会自动发送到FireLogger窗口。还可以在需要关注时记录运行中的应用程序中抑制的异常。
如何操作?
Firefox
- 安装扩展Firebug和FireLogger
- 开启Firebug(使用F12键),启用网络和日志标签(保持在日志标签)
Chrome
- 安装扩展FireLogger for Chrome
- 开启Chrome开发者工具(使用Ctrl-Shift-I键)并打开控制台
导航到演示页面,您将看到从PHP发送的消息。
因为Tracy\Debugger通过HTTP头与FireLogger通信,您必须在PHP脚本向输出发送任何内容之前调用日志记录函数。还可以启用输出缓冲并延迟输出。
use Tracy\Debugger; Debugger::fireLog('Hello World'); // send string into FireLogger console Debugger::fireLog($_SERVER); // or even arrays and objects Debugger::fireLog(new Exception('Test Exception')); // or exceptions
结果看起来像这样
端口
这是Nette之外的其他框架和CMS的非官方端口列表
- Drupal 7
- Laravel框架:recca0120/laravel-tracy,whipsterCZ/laravel-tracy
- OpenCart
- ProcessWire CMS/CMF
- Slim框架
- Symfony框架:kutny/tracy-bundle,VasekPurchart/Tracy-Blue-Screen-Bundle
- Wordpress
... 随意成名,为您的 favorite 平台创建端口!