服务端运行一段时间后,路由会错乱 悬赏,提供有效思路者,200红包,明确解决,500红包! 此贴结贴!!

Qazink

问题原因是

webman里不支持think-validate的Validate::rule()方法
文档里也有说明,是我没看到
截图

感谢各位评论的兄弟

请 xingxing777 加我v qazink 200红包奉上

问题描述

所有的客户端使用的api 都通过自定义路由的方式访问

/sendsms 指向 方法 send_sms 发送短信
/login 指向 方法 login 用于登录,
在运行了一段时间后,/send_sms 有可能会触发其他路由内的方法,比如login
有的时候是30% 的概率会运行到别的方法上,有的时候是90%

补充,只要重启,该问题就会消失,暂时无法调试
本地没有遇到过,但是我不确定是否是因为我启动的时间不够长,
目前是 nginx环境运行一段时间有概率出现,
如果解决了 验证可能会比较久(不超过一周),红包会分两次给!

程序代码或配置

以下为路由配置

Route::post('/sendsms', [LoginController::class, 'send_sms']); // 发送短信验证码
// 需要登录的接口
Route::group("", static function () {
    Route::group('/member', static function () {
        Route::get('/info', [MemberController::class, 'info']); // 会员信息
        Route::post('/submit/verification', [MemberController::class, 'submit_verifications']); // 提交实名信息
        Route::get('/verification', [MemberController::class, 'verification']); // 提交实名信息
        Route::post('/feedback', [MemberController::class, 'feedback']); // 提交实名信息
    });
    Route::group('/tool', static function () {
        Route::post('/ocr', [ToolController::class, 'ocr_idcard']); // 身份证识别
        Route::post('/upload', [ToolController::class, 'uploadimg']); // 图片上传
    });

    Route::group('/order', static function () {
        Route::get('/preview', [OrderController::class, 'preview']); // 下单预览
        Route::post('/submit', [OrderController::class, 'order']); // 下单
    });
})->middleware([LoginMiddleware::class]);

// nginx 配置如下

upstream webman {
    server 127.0.0.1:8787;
    keepalive 10240;
}

   location /prod/ {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://webman/;
        }
           location /api/ {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://webman/;
        }

重现问题的步骤

不能保100%复现,重启就会消失

发生错乱的证据

nginx日志
截图
上述nginx日志中,始终都是同一个方法,访问了同一个路由,但是 返回值的大小是不同的,其中
绿色框 15:50:09 发生的请求是正常响应的,
蓝色框都是错误的,
红色框是重启后的,也都正常了。下面附上对应的runtime日志
截图

根据响应时间和对应使用的表格可以看到, 15:50:09 发生的请求是正常响应的,后续的两次都报错了
也和nginx日志能对应上,

错乱的接口可能是登录接口,下图是我小伙伴给我的反馈,
也就是说 访问的是 api/member/submit/verification 实际的调用方法却是api/login对应的方法
截图

操作系统环境及workerman/webman等具体版本

服务器环境
Linux iZtemyhm9wbs69Z 3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
php版本 8.2
webman 版本 v2.1.2

402 5 0
5个回答

suihua

为啥要写 static function , 把 static 去掉试试吧

  • Qazink 3天前

    收到,感觉关系不大,因为不被匿名函数包裹的路由也有这个bug. 之所以写static 是因为好久之前看到的一个代码规范,说匿名函数加上static效率会更高,就养成习惯,一直保留下来了1

xingxing777

请问你使用什么验证器?

  • Qazink 3天前

    saithink/think-validate 基于 thik-validate 修改的,兼容php8

  • xingxing777 3天前

    我遇到验证器,也是错乱。你排查一下 看对你有没有帮助

  • Qazink 3天前

    和我这个现象差不多? 你用的什么验证器? 最终怎么检查出来的?

  • xingxing777 3天前

    我使用的是 think\facade\Validate 和以前的think验证器 现在最新的不会,具体我也忘了,但是我出现的频率比较高,开发阶段。后面更换了。社区也有其他小伙伴遇到过

  • Qazink 3天前

    兄弟后来换的啥验证器,求指导

  • Qazink 3天前

    感谢兄弟,大概率就是这个问题,加我微信 qazink ,我验证一段时间,没问题就红包!

  • xingxing777 3天前

    红包不用了

vs7717

你在登录接口那边,可以增加记录日志,只是看你描述发现不了什么
记录日志每次请求的路由 是否是 api/login ,如果不是,就记录 。
然后你nginx 为什么两个 location 是同样的配置,完全没必要呀

  • 暂无评论
happy

看看中间件的代码,感觉是这里有问题

  • 暂无评论
xingxing777

不用红包,社区里面互相帮助!

🔝