# 错误复现命令 (ReproduceErrorCommand) ## 概述 `debug:reproduce-error` 命令用于通过 `sys_request_logs` 表中的请求记录来复现错误请求,帮助开发者进行调试和问题排查。 ## 功能特性 - 支持通过 `id`、`request_unid` 或 `run_unid` 查找请求记录 - 自动提取请求记录中的 `protobuf_json` 和 `token` 信息 - 参考 `ProtoJsonRequestTest` 的实现方式发起 HTTP 请求 - 使用环境变量 `UNITTEST_URL` 作为目标地址 - 详细的日志记录和错误处理 - 支持自定义请求超时时间 ## 命令语法 ```bash php artisan debug:reproduce-error [options] ``` ### 参数 - `identifier`: 请求标识符,可以是以下任意一种: - 数据库记录的 `id`(数字) - `request_unid`(字符串) - `run_unid`(字符串) ### 选项 - `--type=TYPE`: 指定标识符类型,可选值: - `auto`(默认):自动检测类型 - `id`:按数据库 ID 查找 - `request_unid`:按请求唯一标识符查找 - `run_unid`:按运行唯一标识符查找 - `--timeout=SECONDS`: 设置请求超时时间(秒),默认为 30 秒 ## 使用示例 ### 1. 通过数据库 ID 复现请求 ```bash php artisan debug:reproduce-error 68973973 ``` ### 2. 通过 request_unid 复现请求 ```bash php artisan debug:reproduce-error 6840202392627 ``` ### 3. 指定标识符类型 ```bash php artisan debug:reproduce-error 68973973 --type=id php artisan debug:reproduce-error 6840202392627 --type=request_unid ``` ### 4. 设置自定义超时时间 ```bash php artisan debug:reproduce-error 68973973 --timeout=60 ``` ## 输出示例 ``` 开始查找请求记录... 标识符: 68973973 类型: auto 找到请求记录: ID: 68973973 Request UNID: 6840202392627 Run UNID: 路径: gameapi 方法: POST 创建时间: 2025-06-04 18:29:55 提取到 token: f4b3c51a58... 目标地址: http://kku_laravel.local.gd/ 开始发起请求... 请求完成,响应结果: 状态码: 200 响应头: Server: nginx/1.27.4 Date: Wed, 04 Jun 2025 12:59:52 GMT Content-Type: application/json Transfer-Encoding: chunked Connection: keep-alive X-Powered-By: PHP/8.3.21 Cache-Control: no-cache, private Vary: Origin 响应内容: {"runUnid":"68404347a6a07","runMs":"6","code":"OK","callpath":"Shop-Query","lastData":[],"shopQuery":{"lastTimes":"1748943300"}} ``` ## 环境配置 确保在 `.env` 文件中配置了正确的 `UNITTEST_URL`: ```env UNITTEST_URL=http://kku_laravel.local.gd/ ``` ## 错误处理 命令会处理以下错误情况: 1. **未找到请求记录**:当指定的标识符在数据库中不存在时 2. **缺少 protobuf_json 数据**:当请求记录中没有必要的请求数据时 3. **网络请求失败**:当向目标服务器发起请求失败时 4. **JSON 解析错误**:当解析 headers 或响应数据失败时 ## 日志记录 命令会在 Laravel 日志中记录详细的执行信息: - 请求开始和完成的时间戳 - 请求和响应的数据长度 - 错误信息和堆栈跟踪 ## 技术实现 ### 核心组件 1. **RequestLog 模型**:用于查询 `sys_request_logs` 表 2. **GuzzleHttp 客户端**:用于发起 HTTP 请求 3. **JSON 解析**:提取 headers 中的 token 信息 4. **错误处理**:完善的异常捕获和用户友好的错误提示 ### 请求流程 1. 根据标识符和类型查找请求记录 2. 验证请求记录的完整性 3. 从 headers 中提取 token 4. 初始化 HTTP 客户端 5. 发起 POST 请求到 `/gameapi` 端点 6. 解析和展示响应结果 ## 注意事项 - 命令会禁用 SSL 验证以支持本地开发环境 - Token 在输出时会被截断显示以保护敏感信息 - 请求超时时间可以根据实际需要调整 - 确保目标服务器能够正常处理复现的请求 ## 相关文件 - 命令文件:`app/Console/Commands/ReproduceErrorCommand.php` - 模型文件:`UCore/Model/RequestLog.php` - 测试参考:`tests/Unit/ProtoJsonRequestTest.php`