使用异步承诺处理 Guzzle 超时
Handle Guzzle timeouts with async promises
我正在发送多个异步承诺,并将 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就设置flag为true。那么你就可以知道在哪个key之后请求失败了。
我正在发送多个异步承诺,并将 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就设置flag为true。那么你就可以知道在哪个key之后请求失败了。