3

I'm trying to measure the response duration for some services called from my application.

I just need a simple method and a rough value is good enough, and I thought I could simply use total_time from curl_getinfo, and get this value from $response->getInfo(), but it is always 0.

Is there some configuration or header that I am missing?

I use

if (!empty($headers)) {
   $httpClient = HttpClient::create(['headers' => [
          'Content-Type' => 'application/json',
          'accept' =>  'application/json',
   ]]);
} else {
   $httpClient = HttpClient::create();
}

if ($method == 'GET') {
   $response = $httpClient->request($method, $url . $pathParams);
} else {
   $response = $httpClient->request($method, $url, ['body' => json_encode($arguments)]);
}

dd($response->getInfo());

and the output contains mostly empty values

^ array:44 [
  "response_headers" => []
  "http_code" => 0
  "error" => null
  "canceled" => false
  "http_method" => "POST"
  "user_data" => null
  "start_time" => 1650918719.2348
  "url" => "https://myworkingexample.com"
  "content_type" => null
  "header_size" => 0
  "request_size" => 0
  "filetime" => -1
  "ssl_verify_result" => 0
  "redirect_count" => 0
  "total_time" => 0.0
  "namelookup_time" => 0.0
  "connect_time" => 0.0
  "pretransfer_time" => 0.0
  "size_upload" => 0.0
  "size_download" => 0.0
  "speed_download" => 0.0
  "speed_upload" => 0.0
  "download_content_length" => -1.0
  "upload_content_length" => -1.0
  "starttransfer_time" => 0.0
  "redirect_time" => 0.0
  "redirect_url" => null
  "primary_ip" => ""
  "certinfo" => []
  "primary_port" => 0
  "local_ip" => ""
  "local_port" => 0
  "http_version" => 0
  "protocol" => 0
  "ssl_verifyresult" => 0
  "scheme" => ""
  "appconnect_time_us" => 0
  "connect_time_us" => 0
  "namelookup_time_us" => 0
  "pretransfer_time_us" => 0
  "redirect_time_us" => 0
  "starttransfer_time_us" => 0
  "total_time_us" => 0
  "debug" => ""
]
0

1 Answer 1

4

The HttpClient is "lazy", and will only execute/resolve the request when it's actually needed.

A call to ResponseInterface::getInfo() is defined to be non-blocking, and won't execute the request. It will just tell you the current state of the request. If you haven't actually executed it, the returned info will be empty, as you are getting.

For getInfo() to return meaningful data, you'll need to call first one of the "blocking" methods. E.g.:

  • $response->getContent()
  • $response->getStatusCode()
  • $response->getHeaders()

Any of these can throw an exception, so you may need to deal with that before you are able to call getInfo().

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.