多次请求同一个路由会出现资源定位错误

半打真心

问题描述

多次请求同一个路由偶尔会出现定位到别的路由接口,比如我请求/user/state接口,偶尔会给我返回/novel/catalogues或者其它接口的内容

最近我有在控制器使用如下的自定义函数,希望达到接口先返回数据,然后控制器继续执行不需要返回数据的逻辑部分,我猜这么做会造成如上的问题

程序代码或配置

if (!function_exists('resDefer')) {
    function resDefer($response, ?\Closure $callback = NULL) {
        if (is_array($response)) $response = \app\struct\Response::build($response);

        if (!($response instanceof \app\struct\Response)) {
            throw new JsonException(Http::PARAMETER_ERROR_MSG, Http::PARAMETER_ERROR_CODE);
        }

        $content = Http::json($response->code, $response->message, $response->data);

        // 这么做可能有问题
        \request()->connection->send($content->withHeaders($response->headers));

        if ($callback) $callback();

        return $content;
    }
}

重现问题的步骤

如题描述

221 3 1
3个回答

释永战

看看是不是哪里动态修改了路由····

  • 半打真心 2024-03-14

    没有动态修改路由,我在本地以及测试服一直测不出这个情况,在我们正式服测出来了,大概十来次会出现一次

  • 半打真心 2024-03-14

    大佬,我的问题描述改了,帮忙看看是不是那个问题。。。

devkeep

我也遇到这个了,返回错乱,好急

  • devkeep 2024-04-05

    估计不是路由问题,感觉像是控制器或者响应无法被回收,再次被使用

  • 半打真心 2024-04-07

    我的确定是\request()->connection->send的问题,应该就是这个方法造成的$request回收的问题

six

造成这个问题的原因很简单,因为你一个请求返回了两次响应。
connection->send 发送了一次响应 A。
return $content时又发送了一次响应 B。

http客户端都是一次请求获取一个响应,客户端请求第一次拿到响应A,下次再请求拿到的大概率是B,所以错乱。

如果你想异步执行个任务,直接定时器就好了。

 function resDefer($response, ?\Closure $callback = NULL) {
        if (is_array($response)) $response = \app\struct\Response::build($response);

        if (!($response instanceof \app\struct\Response)) {
            throw new JsonException(Http::PARAMETER_ERROR_MSG, Http::PARAMETER_ERROR_CODE);
        }

        $content = Http::json($response->code, $response->message, $response->data);

        Timer::add(0.000001, $callback, null, false);

        return $content;
    }
  • 暂无评论
🔝