|
|
@@ -0,0 +1,115 @@
|
|
|
+# 修复Matchexchange除零错误
|
|
|
+
|
|
|
+## 任务时间
|
|
|
+- 开始时间:2025年06月12日 17:07:47 CST
|
|
|
+- 完成时间:2025年06月12日 17:10:00 CST
|
|
|
+
|
|
|
+## 问题描述
|
|
|
+在处理 `request_1749718293522` 请求时,`app/Module/AppGame/Handler/Matchexchange/ListHandler.php` 第65行发生除零错误:
|
|
|
+
|
|
|
+```
|
|
|
+[2025-06-12T17:05:58.489442+08:00] laravel.ERROR: Division by zero {"exception":"[object] (DivisionByZeroError(code: 0): Division by zero at /var/www/html/app/Module/AppGame/Handler/Matchexchange/ListHandler.php:65)"}
|
|
|
+```
|
|
|
+
|
|
|
+## 问题分析
|
|
|
+1. **错误位置**:`ListHandler.php` 第65行 `$lastPage = ceil(($result['total'] ?? 0) / $pageSize);`
|
|
|
+2. **根本原因**:客户端请求中的 `page.per_page` 字段未设置,导致默认值为0
|
|
|
+3. **请求数据**:
|
|
|
+ ```json
|
|
|
+ {
|
|
|
+ "requestUnid": "request_1749718293522",
|
|
|
+ "matchexchangeList": {
|
|
|
+ "itemId": "3",
|
|
|
+ "page": {
|
|
|
+ "page": "1"
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ```
|
|
|
+ 注意:`page` 对象中只有 `page` 字段,缺少 `per_page` 字段
|
|
|
+
|
|
|
+## 修复方案
|
|
|
+在处理分页参数时增加有效性检查,确保 `$pageSize` 不为0:
|
|
|
+
|
|
|
+### 修改前代码
|
|
|
+```php
|
|
|
+// 解析分页参数
|
|
|
+$pageNum = $page ? $page->getPage() : 1;
|
|
|
+$pageSize = $page ? $page->getPerPage() : 20;
|
|
|
+
|
|
|
+// 限制分页大小
|
|
|
+$pageSize = min($pageSize, 100);
|
|
|
+$pageNum = max($pageNum, 1);
|
|
|
+```
|
|
|
+
|
|
|
+### 修改后代码
|
|
|
+```php
|
|
|
+// 解析分页参数
|
|
|
+$pageNum = $page ? $page->getPage() : 1;
|
|
|
+$pageSize = $page ? $page->getPerPage() : 20;
|
|
|
+
|
|
|
+// 确保分页参数有效,防止除零错误
|
|
|
+$pageSize = $pageSize > 0 ? $pageSize : 20;
|
|
|
+$pageNum = $pageNum > 0 ? $pageNum : 1;
|
|
|
+
|
|
|
+// 限制分页大小
|
|
|
+$pageSize = min($pageSize, 100);
|
|
|
+$pageNum = max($pageNum, 1);
|
|
|
+```
|
|
|
+
|
|
|
+## 修复验证
|
|
|
+使用重放命令验证修复效果:
|
|
|
+
|
|
|
+```bash
|
|
|
+php artisan debug:reproduce-error request_1749718293522
|
|
|
+```
|
|
|
+
|
|
|
+### 修复前结果
|
|
|
+- 状态码:500
|
|
|
+- 错误:Division by zero
|
|
|
+
|
|
|
+### 修复后结果
|
|
|
+- 状态码:200
|
|
|
+- 响应正常:
|
|
|
+ ```json
|
|
|
+ {
|
|
|
+ "runUnid": "684a994dea0b9",
|
|
|
+ "runMs": "234",
|
|
|
+ "code": "OK",
|
|
|
+ "callpath": "Matchexchange-List",
|
|
|
+ "lastData": [],
|
|
|
+ "matchexchangeList": {
|
|
|
+ "page": {
|
|
|
+ "currentPage": "1",
|
|
|
+ "perPage": "20"
|
|
|
+ },
|
|
|
+ "price": {
|
|
|
+ "itemId": "3",
|
|
|
+ "minPrice": 10.5,
|
|
|
+ "maxPrice": 25.8
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ```
|
|
|
+
|
|
|
+## 技术细节
|
|
|
+1. **Protobuf默认值**:根据 `protophp/Uraus/Kku/Common/RequestPage.php`,`per_page` 字段的默认值为0
|
|
|
+2. **防御性编程**:在进行除法运算前,必须检查除数是否为0
|
|
|
+3. **业务逻辑**:当 `per_page` 为0或负数时,使用默认值20
|
|
|
+
|
|
|
+## 提交信息
|
|
|
+```
|
|
|
+修复Matchexchange ListHandler除零错误
|
|
|
+
|
|
|
+- 问题:当客户端请求中page.per_page字段未设置时,默认值为0导致除零错误
|
|
|
+- 修复:在处理分页参数时增加有效性检查,确保pageSize不为0
|
|
|
+- 测试:使用php artisan debug:reproduce-error验证修复有效
|
|
|
+```
|
|
|
+
|
|
|
+## 影响范围
|
|
|
+- 修改文件:`app/Module/AppGame/Handler/Matchexchange/ListHandler.php`
|
|
|
+- 影响功能:交易大厅成交列表查询
|
|
|
+- 风险评估:低风险,仅增加参数有效性检查
|
|
|
+
|
|
|
+## 总结
|
|
|
+通过增加分页参数的有效性检查,成功修复了除零错误。这是一个典型的防御性编程实践,确保在处理外部输入时进行必要的验证。
|