2015-09-22 12 views
9

Attualmente con Guzzle 6 sembra che non ci sia modo fuori dalla scatola per ottenere la durata di una chiamata API. Qual è il modo migliore per ottenere questa statistica con una normale chiamata usando il codice qui sotto.Qual è il modo migliore per ottenere la durata di una chiamata API utilizzando Guzzle 6

Sto utilizzando il seguente codice da 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(); 

risposta

3

vi rimando alla opzione richiesta dei '' on_stats Guzzle Docs - Request Options e la TransferStats object

Per attuare questo si dovrebbe modificare la richiesta arriva a utilizzare richiedere opzioni. Sarebbe qualcosa di simile al seguente:

// 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(); 

** Nota: Sono certo ci sono modi per garantire il log viene formattato più bello, tuttavia, questo doveva servire come una prova di concetto.

Gli TransferStats vengono generati e utilizzati all'interno dei singoli gestori e in questo momento non vengono resi disponibili dal gestore allo stack. Di conseguenza, non sono disponibili per il consumo all'interno dei middleware secondari posizionati sullo stack.

+0

Qualche idea su come utilizzare il codice sopra per implementare le statistiche di trasferimento? – KingKongFrog

+0

risposta modificata per riflettere la tua domanda. –

+0

Ancora non capisco come posso inviare il trasferimento all'handler in modo che possa essere nella stessa uscita? Ad esempio: 'new MessageFormatter ('{req_body} - {res_body} - {REQUEST_TIME}')' – KingKongFrog

Problemi correlati