Каков наилучший способ получить длительность вызова API с помощью Guzzle 6?

В настоящее время с Guzzle 6 кажется, что нет никакого способа получить длительность вызова API. Какой лучший способ получить эту статистику при любом обычном звонке, используя код ниже.

Я использую следующий код из Как вы регистрируете все вызовы API с помощью Guzzle 6

use GuzzleHttp\HandlerStack;
use GuzzleHttp\Middleware;
use GuzzleHttp\MessageFormatter;
use Monolog\Logger;

$stack = HandlerStack::create();
$stack->push(
Middleware::log(
new Logger('Logger'),
new MessageFormatter('{req_body} - {res_body}')
)
);
$client = new \GuzzleHttp\Client(
[
'base_uri' => 'http://httpbin.org',
'handler' => $stack,
]
);

echo (string) $client->get('ip')->getBody();

10

Решение

Я отсылаю вас к опции запроса on_stats Guzzle Docs — варианты запроса
и Объект TransferStats

Чтобы реализовать это, вы должны изменить ваш запрос на получение, чтобы использовать параметры запроса. Это было бы что-то вроде следующего:

// get($uri, $options) proxies to request($method, $uri, $options)
// request($method, $uri, $options) proxies to requestAsync($method, $uri, $options)
// and sets the $options[RequestOptions::SYNCHRONOUS] to true
// and then waits for promises to resolve returning a Psr7\http-message\ResponseInterface instance

$response = $client->get($uri, [
'on_stats'  => function (TransferStats $stats) use ($logger) {
// do something inside the callable.
echo $stats->getTransferTime() . "\n";
$logger->debug('Request' . $stats->getRequest() .
'Response' . $stat->getResponse() .
'Tx Time' . $stat->getTransferTime()
);
},
]);
echo $response->getBody();

** Примечание: я уверен, что есть способы обеспечить, чтобы журнал был лучше отформатирован, однако это послужило подтверждением концепции.

TransferStats генерируются и используются в отдельных обработчиках и в настоящее время не доступны обработчику для стека. В результате они не доступны для потребления в отдельных промежуточных программах, размещенных в стеке.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]