dogma / dogma-debug
强大的远程调试/转储工具
Requires
- php: ^7.1|^8.0
Requires (Dev)
- dogma/dogma: *
- dogma/dogma-dev: 0.1.28
- phpstan/phpstan: 1.4.10
Suggests
- ext-iconv: Any of ext-mb|ext-intl|ext-iconv for unicode strings
- ext-intl: Any of ext-mb|ext-intl|ext-iconv for unicode strings
- ext-mb: Any of ext-mb|ext-intl|ext-iconv for unicode strings
- ext-sockets: If you want to use socket connection (alternatives are log file or printing to stdout)
This package is auto-updated.
Last update: 2024-08-27 16:50:17 UTC
README
远程控制台调试器
- 将格式化的调试数据输出到控制台运行的调试服务器
- Tracy/Symfony调试栏的替代方案,用于调试CLI脚本、后台任务、许多并发请求等。
包含
- 带有许多有用快捷函数的远程转储器(《Dogma\Debug\Dumper》)
- 异常处理程序(《..\ExceptionHandler》)
- 错误处理程序和统计(《ErrorHandler》)
- 处理进程信号和终止跟踪(《ShutdownHandler》)
- 请求信息(《RequestHandler》)
- 资源使用跟踪器(《ResourcesHandler》)
- 标准输出跟踪器和统计(《OutputHandler》)
- SQL io跟踪器和统计(《SqlHandler》)
- Redis io跟踪器和统计(《RedisHandler》)
- 用于调试流io操作的流处理程序(数据、文件、ftp、http、phar、zlib - 《*StreamHandler》)
- 用于调试流传输上的io操作的处理器(tcp、udp、unix、udg、ssl、tls - 《FilesHandler》)
- 跟踪各种系统函数组的处理器(curl、dns、mail、设置、syslog)
要求
- PHP 7.1+
- ext-sockets(也可以在不使用套接字的情况下本地运行)
安装
运行 composer create-project dogma/dogma-debug。
使用
警告:Dogma - Debug 仅用于开发。
它在后台执行一些非常糟糕的事情(例如重写源代码)来实现它的功能,您绝对不应该在生产环境中使用实时数据执行此类操作。
它不是像Tracy/Symfony/Laravel错误日志这样的生产调试记录器,它并不旨在取代它们。
- 在某个本地控制台中运行
php server.php以显示输出(在端口1729上启动套接字服务器)。 - 将
shortcuts.php或client.php包含到您的代码中,或在使用php.ini中的auto_prepend_file指令时使用它。 - 您可以在客户端所在的同一目录中创建
debug-config.php以配置它。
转储器
转储器具有许多功能和配置选项,可以使转储输出更加紧凑、可读和可用 - 例如
- 关于转储值的丰富信息(大小、长度、格式化时间戳、标志整数的二进制组件...)
- 类型的自定义和内置格式化程序
- 单行模式下的类型自定义和内置格式化程序
- 转储类和函数的静态成员(调用为
rd(Foo::class)或rd([Foo::class, 'method'])) - 转储闭包中的绑定值
- 自定义计时器以及测量给定请求中使用的资源和时间
- 从文件路径和命名空间中删除已知的前缀
- 少量项目的单行数组转储
- 可配置的调用堆栈信息用于转储
- 自定义颜色配置
函数快捷键
ld($value, ...)- 本地转储lvd($value, ...)- 使用本地 var_dump() + 一些颜色实现的本地转储rd($value, ...);- 远程转储rvd($value, ...);- 使用本地 var_dump() + 一些颜色实现的远程转储rc($callable, ...)- 远程捕获转储(转储可调用的输出结果)rb($length, $argsDepth, $codeLines, $codeDepth, $callstack)- 远程回溯转储rf()- 远程打印函数/方法名称rl($label, [$name])- 远程打印用户定义的标签rt([$name])- 远程计时器/计数器。显示自上一个事件以来经过的时间rm([$name])- 远程内存报告。显示自上一个事件以来消耗/释放的内存rw($string)- 远程写入。将原始格式化字符串写入调试输出
其他
Dumper::varDump()- 更好格式化和着色var_dump()
配置
常用
int Dumper::$maxDepth- 要遍历的结构最大深度(默认3)int Dumper::$maxLength- 输出字符串的最大长度(以字符为单位)(默认1000)int Dumper::$shortArraysMaxLength- 单行输出短数组的最大长度 - 例如[1, 2, 3](默认100)int Dumper::$shortArrayMaxItems- 单行输出短数组的项目最大计数(默认20)bool Dumper::$alwaysShowArrayKeys- 设置为 true 以显示从 0 开始的列表的键(默认false)string Dumper::$stringsEncoding- 输出字符串的编码。输出始终是 UTF-8(默认'utf-8')string[] Dumper::$hiddenFields- 从输出中隐藏的字段名称 - 例如password等。bool Dumper::$showInfo- 显示已输出值的扩展信息 - 例如"ÁČŘ" // 3 ch, 6 Bstring Dumper::$infoTimeZone- 从已输出整型/浮点型时间戳格式化可读时间信息的时间区域int Dumper::$propertyOrder- 对象输出的属性排序。默认为Dumper::ORDER_VISIBILITY_ALPHABETICarray<string, string> Dumper::$namespaceReplacements- 用于缩短输出类命名空间的正则表达式和替换映射
跟踪
int Dumper::$traceLength- 输出值的调用栈的行数(默认1)bool Dumper::$traceDetails- 在调用栈中显示类和方法(默认true)int Dumper::$traceArgsDepth- 调用栈中函数/方法参数的深度(默认0)int[] Dumper::$traceCodeLines- 在调用栈中的每个项目显示 n 行代码(默认[5]- 意味着第一个项目为 5 行,其余为 0)array{0: string|null $class, 1: string|null $method} Dumper::$traceSkip- 调用栈中要跳过的函数/方法string[] Dumper::$trimPathPrefix- 要修剪的文件路径前缀列表- 由
Dumper::trimPathPrefixBefore()和Dumper::trimPathPrefixAfter()配置
- 由
格式化程序
bool Dumper::$useFormatters- 切换以使用自定义和内置类型格式化程序(默认true)array<class-string, callable> Dumper::$formatters- 自定义和内置类型格式化程序列表array<class-string, callable> Dumper::$shortFormatters- 当 $maxDepth 达到时单行输出用的自定义和内置类型格式化程序列表class-string[] Dumper::$doNotTraverse- 禁止遍历的类名称列表(不会污染输出)
输出
array<string, string> Dumper::$colors- 输出着色定义。见特性DumperFormatters
错误处理器
在请求完成后打印格式化错误/警告/通知,带有调用栈和错误统计信息
通过调用 ErrorHandler::enable($types) 激活
配置
int $types- 处理的错误类型(默认E_ALL)bool ErrorHandler::$catch- 切换以捕获错误 - 防止运行默认 PHP 错误处理器(默认false)int ErrorHandler::$printLimit- 在远程控制台中显示的错误数量(默认0)bool ErorrHandler::$uniqueOnly- 仅显示不同类型的错误(默认true)bool ErrorHandler::$listErrors- 在请求结束时列出错误bool ErrorHandler::$showLastError- 显示可能被另一个错误处理器隐藏的最后错误bool ErrorHandler::$countMutedErrors- 将用 @ 操作符静音的错误计入统计信息bool ErrorHandler::$showMutedErrors- 显示用 @ 操作符静音的错误bool ErrorHandler::$filterTrace- 打开/关闭调用栈过滤(在 Dumper 中配置)string[][] ErrorHandler::$ignore- 要忽略的错误列表(键是连接类型和消息,项是连接的文件路径后缀和行)- 例如
ErrorHandler::$ignore = ['Notice: Undefined index "x".' => ['some-file.php:17', 'other-file.php:29']]
- 例如
ErrorHandler
打印带调用栈的格式化未捕获异常
通过调用 ExceptionHandler::enable() 激活
通过调用 ExceptionHandler::inspectThrownExceptions(...) 激活检查捕获的异常
配置
int ExceptionHandler::$traceLength- 显示调用栈帧的数量(默认1000)int ExceptionHandler::$traceArgsDepth- 调用函数/方法时遍历参数的最大深度(默认1)int ExceptionHandler::$traceCodeLines- 在输出的调用栈帧中显示的代码行数(默认5)int ExceptionHandler::$traceCodeDepth- 显示代码的调用栈帧数量(默认5)class-string[] ExceptionHandler::$logExceptions- 检查捕获的异常时记录的异常class-string[] ExceptionHandler::$notLogExceptions- 检查捕获的异常时不记录的异常bool ExceptionHandler::$filterTrace- 打开/关闭调用栈过滤(在Dumper中配置)
OutputHandler
报告输出操作(echo)和输出开始
通过调用 OutputHandler::enable() 激活
配置
bool OutputHandler::$printOutput- 打印输出样本(默认false)int OutputHandler::$maxLength- 打印输出样本的最大长度(默认100)
RedisHandler
报告与Redis服务器的通信
目前仅支持通过io流连接的Predis
通过调用 RedisHandler::enableForPredis() 激活
配置
bool RedisHandler::$log- 打开/关闭日志记录(默认true)int RedisHandler::$maxLength- 记录消息的最大长度(默认2000)bool RedisHandler::$filterTrace- 打开/关闭调用栈过滤(在Dumper中配置)string[] RedisHandler::$traceFilters- 此处理器特定的附加调用栈过滤
RequestHandler
报告请求输入和输出
无需激活。此处理器仅包含调试器头部和尾部的配置
配置
bool RequestHandler::$showIndex- 在调试器头部显示索引文件名(默认true)bool RequestHandler::$requestHeaders- 打印请求头部(默认false)bool RequestHandler::$requestCookies- 打印请求cookie(默认false)bool RequestHandler::$requestBody- 打印请求体(默认false)bool RequestHandler::$stdinData- 显示通过STDIN接收的数据(默认false)bool RequestHandler::$responseHeaders- 打印响应头部(默认false)bool RequestHandler::$responseCookies- 打印响应cookie(默认false)string[] RequestHandler::$methodColors- 调试器头部HTTP方法标签颜色的配置string[] RequestHandler::$responseColors- 调试器尾部HTTP响应状态标签颜色的配置
ShutdownHandler
报告Linux/Unix上的进程信号(如SIGTERM等)和Windows上的Ctrl-C信号。与ResourcesHandler和Debugger一起尝试确定导致进程终止的原因
通过调用 ShutdownHandler::enable() 激活
SqlHandler
报告SQL数据库查询和事件
目前仅直接支持Dibi抽象层,但您可以注册自己的日志函数
通过在您的数据库层注册回调到SqlHandler::log()激活
配置
int SqlHandler::$logEvent- 要记录的事件类型(默认SqlHandler::ALL)bool SqlHandler::$filterTrace- 打开/关闭调用栈过滤(在Dumper中配置)
Stream wrappers
通过在PHP流上注册流处理器来报告PHP流的I/O操作(如fopen()、fwrite()等)
同时通过重写包含文件的源代码和“装饰”原生PHP函数和结构来启用拦截器以执行其操作
包装器
FileStreamWrapper- 在file://或没有方案前缀的文件名上执行I/O操作PharStreamWrapper- 在phar://上执行I/O操作HttpStreamWrapper- 在http://和https://上执行I/O操作FtpStreamWrapper- 在ftp://和ftps://上进行 io 操作DataStreamWrapper- 在data://上进行 io 操作PhpStreamWrapper- 在php://上进行 io 操作ZlibStreamWrapper- 在zlib://和zip://上进行 io 操作
通过调用例如 FileStreamWrapper::enable() 来激活
配置
int FileStreamWrapper::$log- 要记录的 io 操作类型(默认StreamWrapper::ALL & ~StreamWrapper::INFO)bool FileStreamWrapper::$logIncludes- 是否记录 PHP include 和 require 的 io 操作(默认true)callable FileStreamWrapper::$logFilter- 自定义 io 操作记录的过滤器
其他所有流处理器类似
拦截器
通过在流包装器中实现代码重写魔法,我们可以跟踪或禁用系统函数和构造的使用(如 exit 和 die)
目前实现了以下拦截器
AutoloadInterceptor- 跟踪自动加载函数的使用CurlInterceptor- 跟踪 Curl 扩展函数的使用DnsInterceptor- 跟踪 DNS 相关函数的使用ErrorInterceptor- 跟踪错误/异常相关函数的使用StreamInterceptor- 跟踪文件系统相关函数的使用。在不支持包装器的流传输(如tcp、udp、unix、udg、ssl、tls)上很有用HeadersInterceptor- 跟踪处理 HTTP 标头的函数的使用Mailinterceptor- 跟踪mail()函数的使用MysqliInterceptor- 跟踪 mysqli 函数的使用并记录 SQL 查询ProcessInterceptor- 跟踪与进程终止和信号相关的函数的使用Resourcesinterceptor- 跟踪与资源(时间、内存)相关的函数的使用SessionInterceptor- 跟踪会话函数的使用SettingsInterceptor- 跟踪更改 PHP 配置或环境配置的函数的使用StreamInterceptor- 跟踪流包装器和流过滤器函数的使用SyslogInterceptor- 跟踪 syslog 函数的使用
有关拦截的本地函数的更完整列表,请参阅 Intercept.php
有了这些处理器,您可以调查任何外部库或您的代码的确切操作内容和时间,而无需在该库中启用某些日志支持,也无需使用 XDebug 等步进调试器
要跟踪尚未覆盖的任何本地 PHP 函数,编写类似处理器非常简单
您可以通过调用 *Interceptor::intercept...() 方法来为函数组激活拦截
当更改拦截配置时,您可能需要清除 opcode 缓存,因为 PHP 代码是在线重写的,PHP 并不知道哪些文件应该重新加载(带有新更改)。当使用 Apache 时,您可以运行例如 service apache2 restart 来完成此操作
作者
Vlasta Neubauer, https://twitter.com/paranoiq