微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用异步承诺处理 Guzzle 超时

如何解决使用异步承诺处理 Guzzle 超时

我正在发送多个异步承诺,并将 guzzle 超时设置为 30,我想知道如何捕获是否有任何承诺超时,以便我可以报告此错误。 请看下面的代码。本质上,我想在超时之前使用我可以使用的任何响应并捕获那些超时的响应。

foreach ($apiRequests as $guzzleParameters) {
    $request = new Request($guzzleParameters->getType(),$guzzleParameters->getApiEndpoint(),$guzzleParameters->getHeaders(),$guzzleParameters->getBody());
    $promises[$guzzleParameters->createKey()] = $this->client->sendAsync($request)->then(
                function (ResponseInterface $res) {
                    return $res;
                },function (RequestException $e) {
                    switch ($e->getCode()) {
                        case 400:
                        // log error 
                            break;
                        case 401:
                        // log error 
                            break;
                        case 403:
                        // log error 
                            break;
                        case 404:
                        // log error 
                            break;
                    }
                    return $e->getResponse();
                }
            );
        }
$responses = Promise\Utils::settle($promises)->wait(true);

解决方法

据我所知,您希望以异步方式记录每个请求的时间,然后您可以将其相加并在总和达到 30 以上时放置一个标志。

注意:未测试的代码,但测试了 on_stats 部分的代码

foreach ($apiRequests as $key => $guzzleParameters) {
    $LogStats = [];
    $request = new Request($guzzleParameters->getType(),$guzzleParameters->getApiEndpoint(),$guzzleParameters->getHeaders(),$guzzleParameters->getBody());
    $promises[$guzzleParameters->createKey()] = $this->client->sendAsync($request,[
                    'on_stats' => function (\GuzzleHttp\TransferStats $stats) {
                        // $LogStats["uri"] = $stats->getEffectiveUri();
                        $LogStats[$key]["time"] = $stats->getTransferTime();
                        // $LogStats["stats"] = json_encode($stats->getHandlerStats());
                        // Log::debug("\n--------------------------------\nDebug Solr Request Stats :: ",$LogStats);
                    }
                ])->then(
                function (ResponseInterface $res) {
                    return $res;
                },function (RequestException $e) {
                     // ....
                    }
                    return $e->getResponse();
                }
            );
        }
$responses = Promise\Utils::settle($promises)->wait(true);

这里我使用了 on_stats,你可以一直计算,然后总结,一旦达到 30 设置标志为真。然后你就可以知道请求失败了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。