chevere / xr
Requires
- php: ^8.1
- ext-curl: *
- ext-json: *
- chevere/filesystem: ^1.0.0
- chevere/message: ^1.0.0
- chevere/standard: ^1.0.1
- chevere/throwable-handler: ^1.0.2
- chevere/trace: ^2.0.0
- chevere/var-dump: ^2.0.0
- phpseclib/phpseclib: ~3.0
Requires (Dev)
- dg/bypass-finals: ^1.4
- phpstan/phpstan: ^1.9
- phpunit/phpunit: ^9.5
- symplify/easy-coding-standard: ^11.1
README
🔔 订阅 时事通讯,不错过任何关于 Chevere 的更新。
摘要
PHP 客户端库为 xrDebug。此库提供了一系列函数,用于变量转储、发送原始消息和与检查器交互。
VarDump 功能由 VarDump 包提供,而可抛出对象处理则由 ThrowableHandler 包提供。
快速开始
使用 Composer 安装。
composer require --dev xrdebug/php
确保在项目的入口文件(通常是 index.php)中加载 Composer 的 autoload.php 文件。
require_once __DIR__ . '/vendor/autoload.php';
在您的代码中直接使用 xr() 来转储任何变量。例如,对于 WordPress 插件
add_action('plugins_loaded', function () { $userCanManageOptions = current_user_can('manage_options'); xr($userCanManageOptions); });
演示
在 ./demo 目录中有此库的交互式演示。要使用演示,请使用默认设置执行 xrdebug 服务器。
执行以下命令以启动演示,它将向 xrDebug 服务器发送消息,解释调试器用户界面。
php demo/welcome.php
执行以下命令以查看 xrDebug 如何 处理错误。
php demo/error-handling.php
调试助手
此 xrDebug PHP 客户端在根命名空间中提供了以下辅助函数。您可以在代码的任何位置使用这些函数。
xr
使用函数 xr($var1, $var2,...) 转储一个或多个变量。
xr($var, 'Hola, mundo!');
使用 t: 传递一个主题。
xr($var, t: 'Epic win');
使用 e: 传递一个表情。
xr($var, e: '😎');
传递位运算标志以触发特殊行为。
- 使用
f: XR_BACKTRACE包括调试回溯。
xr($var, f: XR_BACKTRACE);
xrr
使用函数 xrr() 发送原始消息。
xrr('<h1>Hola, mundo!</h1>'); xrr('<span>Test</span>', t: 'Epic win'); xrr('<b>test</b>', e: '😎'); xrr('some string<br>', f: XR_BACKTRACE);
xri
使用函数 xri() 与检查器交互。
使用 pause 暂停代码执行。
xri()->pause();
使用 memory 发送内存使用信息。
xri()->memory();
vd
函数 vd 是 var_dump 的直接替换,它由 VarDump 包提供。它将一个或多个变量的信息打印到输出流。
vd($var1, $var2,); // more code
vdd
函数 vdd 与 vd 功能相同,但使用 die(0) 停止进一步执行。
vdd($var); // does exit();
配置
基于代码的配置
使用 xrConfig() 配置 xrDebug 服务器连接。
xrConfig(
isEnabled: true,
isHttps: false,
host: 'localhost',
port: 27420,
key: file_get_contents('private.key')
);
基于文件的配置
通过在项目根目录中放置 xr.php 文件来配置客户端。
我们建议将
xr.php添加到您的.gitignore文件中。
<?php return [ 'isEnabled' => true, 'isHttps' => false, 'host' => 'localhost', 'port' => 27420, 'key' => file_get_contents('private.key'), ];
错误处理
要使用 xrDebug 处理错误,您需要配置项目以将错误处理为异常,并注册一个关闭函数
use Chevere\ThrowableHandler\ThrowableHandler; set_error_handler( ThrowableHandler::ERROR_AS_EXCEPTION ); register_shutdown_function( ThrowableHandler::SHUTDOWN_ERROR_AS_EXCEPTION );
异常处理
PHP 客户端提供了一个可抛出对象处理程序,它可以通过 ThrowableHandler 包挂钩或替换现有的异常处理逻辑。
注册处理器
使用 registerThrowableHandler 启用 xrDebug 异常处理。
use Chevere\xrDebug\PHP\registerThrowableHandler; // True append xrDebug to your existing handler // False use only xrDebug handler registerThrowableHandler(true);
触发处理器
在任何现有的异常处理逻辑中使用 throwableHandler
use Chevere\xrDebug\PHP\throwableHandler; set_exception_handler( function(Throwable $throwable) { // ... try { throwableHandler($throwable); } catch(Throwable) { // Don't panic } } );
自定义检查器
可以定义额外的检查器来提供更多上下文相关的调试信息。要创建自定义检查器,使用 XrInspectorTrait 实现 XrInspectorInterface 并使用 sendCommand 方法。
对于下面的代码,myDump 定义了一个方法,该方法将从您的应用程序逻辑中流式传输数据,而 myPause 默认发送带有调试回溯的暂停。
<?php use Chevere\xrDebug\PHP\Traits\XrInspectorTrait; use Chevere\xrDebug\PHP\Interfaces\XrInspectorInterface; class MyInspector implements XrInspectorInterface { use XrInspectorTrait; public function myDump( string $t = '', string $e = '', int $f = 0, ): void { $data = 'my queries from somewhere...'; $this->sendCommand( command: 'message', body: $data, topic: $t, emote: $e, flags: $f, ); } public function myPause( int $f = XR_DEBUG_BACKTRACE, ): void { $this->sendCommand( command: 'pause', flags: $f, ); } }
sendCommand 方法使您能够与现有的 xrDebug 实例进行交互。
private function sendCommand( string $command, string $body = '', string $topic = '', string $emote = '', int $flags = 0 );
空检查器
如果 xrDebug 未启用,则需要空检查器来阻止任何检查调用。空检查器应该实现与真实检查器相同的方法,但不需要执行任何操作。
💡 使用 XrInspectorNullTrait 来实现 XrInspectorInterface,当提供空检查器时。
<?php use Chevere\xrDebug\PHP\Traits\XrInspectorNullTrait; use Chevere\xrDebug\PHP\Interfaces\XrInspectorInterface; class MyInspectorNull implements XrInspectorInterface { use XrInspectorNullTrait; public function myDump( string $t = '', string $e = '', int $f = 0, ): void { } public function myPause( int $f = XR_DEBUG_BACKTRACE, ): void { } }
自定义检查器的辅助函数
use Chevere\xrDebug\PHP\XrInspectorInstance; use Chevere\xrDebug\PHP\Interfaces\XrInspectorInterface; use LogicException; use MyInspector; use MyInspectorNull; function my_inspector(): MyInspector { try { return XrInspectorInstance::get(); } catch (LogicException) { $inspector = getXr()->enable() ? MyInspector::class : MyInspectorNull::class; $client = getXr()->client(); $inspector = new $inspector($client); $instance = new XrInspectorInstance($inspector); return $instance::get(); } }
要使用您的自定义辅助函数
my_inspector()->myDump(); my_inspector()->myPause();
文档
文档可在 docs.xrdebug.com 上找到。
许可
xrDebug 遵循 Apache 许可协议,版本 2.0。有关完整的许可文本,请参阅 LICENSE。
除非适用法律要求或书面同意,否则在许可下分发的软件按“现状”分发,不提供任何明示或暗示的保证或条件。有关许可的具体语言、权限和限制,请参阅许可协议。