2015-09-22 96 views
9

目前有了Guzzle 6,似乎沒有開箱即可獲得API調用的持續時間。使用下面的代碼通過任何普通呼叫獲得此屬性的最佳方式是什麼?什麼是使用Guzzle獲得API調用的持續時間的最佳方式6

我使用下面的代碼從How do you log all API calls using 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(); 

回答

3

我是指你的「on_stats」請求選項Guzzle Docs - Request OptionsTransferStats object

要實現這一點,你會修改GET請求來使用請求選項。這將是類似以下內容:

// 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在單個處理程序中生成並使用,並且此時處理程序無法使用該堆棧。因此,它們不可用於放置在堆棧上的各個中間件內的消耗。

+0

任何想法如何使用上述代碼來實現轉移統計? – KingKongFrog

+0

編輯答案反映你的問題。 –

+0

我仍然不知道如何將轉文發送給處理程序,以便它可以處於相同的輸出中?例如:'new MessageFormatter('{req_body} - {res_body} - {REQUEST_TIME}')' – KingKongFrog

相關問題