Как приблизительное время соединения прокси-сервера для запроса cURL, используя значения CURLINFO_*_TIME?

Ниже приведен небольшой набор данных, из которого я пытаюсь ответить на два вопроса:

  1. Сколько времени понадобилось прокси для подключения к серверу API?
  2. Сколько времени занял запрос API для возврата?

Основной код выглядит так:

$c             = curl_init();           // assume all options set correctly
$time          = microtime(true);
$response      = curl_exec($c);
$curl_info     = curl_getinfo($c);      // Returns each `*_TIME` field
$response_time = microtime(true)-$time; // Returns total PHP execution time

Из вышесказанного я строю это:

id  response_time   NAMELOOKUP_TIME CONNECT_TIME    APPCONNECT_TIME PRETRANSFER_TIME    STARTTRANSFER_TIME  REDIRECT_TIME   TOTAL_TIME
1   0.250691        0.000191        0.025070        NULL            0.181040            0.250239            0.000000        0.250306
2   0.958577        0.000129        0.022764        NULL            0.136846            0.664099            0.000000        0.957881
3   0.578614        0.000053        0.021111        NULL            0.127998            0.440123            0.000000        0.577812

Сколько времени было потрачено на прокси против запроса API для каждого из вышеперечисленных?


Документация cURL полезна, но я не уверен, как ответить на мои вопросы выше с соответствующим разделом из документов:

TOTAL_TIME           Total time of previous transfer.
NAMELOOKUP_TIME      Time from start until name resolving completed.
CONNECT_TIME         Time from start until remote host or proxy completed.
APPCONNECT_TIME      Time from start until SSL/SSH handshake completed.
PRETRANSFER_TIME     Time from start until just before the transfer begins.
STARTTRANSFER_TIME   Time from start until just when the first byte is received.
REDIRECT_TIME        Time taken for all redirect steps before the final transfer.

Включенный график полезен, чтобы увидеть, как складываются эти времена:

|
|--NAMELOOKUP
|--|--CONNECT
|--|--|--APPCONNECT
|--|--|--|--PRETRANSFER
|--|--|--|--|--STARTTRANSFER
|--|--|--|--|--|--TOTAL
|--|--|--|--|--|--REDIRECT

Но я все еще не уверен, к какому атрибуту относится время подключения прокси. Вот тот же график с моими комментариями:

|
|--NAMELOOKUP                 // DNS, clearly not proxy. Also insignificant values.
|--|--CONNECT                 // Does this count toward Proxy Time?
|--|--|--APPCONNECT           // Not set (likely due to non-https transaction)
|--|--|--|--PRETRANSFER       // Does this count toward Proxy Time?
|--|--|--|--|--STARTTRANSFER  // Stop proxy time? So Proxy Time = STARTTRANSFER?
|--|--|--|--|--|--TOTAL       // Would TOTAL-STARTRANSFER = API Request Time?
|--|--|--|--|--|--REDIRECT    // Always 0 (???)

Вот диаграмма того, как работают HTTP-прокси. Где перечисленные выше элементы CURLINFO_*_TIME вписываются в этот график?

https://blog.thousandeyes.com/wp-content/uploads/2013/09/image012.png

1 ответ

Я не думаю, что есть какой-то способ точно рассчитать, что вы ищете.

cURL подключается к прокси, отправляет запрос и ожидает ответа. Все, что прокси-сервер делает по времени (это собственное разрешение DNS, подключение к хосту, отправка (проксирование) запроса, ожидание ответа, чтение ответа и обратная передача его обратно, является черным ящиком для cURL.

Невозможно узнать, как долго эти шаги выполнялись по отдельности исключительно через прокси-сервер HTTP/SOCKS.

Единственное, что вы можете точно знать, это сумма всех этих действий (CURLINFO_TOTAL_TIME - CURLINFO_STARTTRANSFER_TIME). Я предполагаю, что даже возможно, что с момента, когда прокси завершит запрос, может быть небольшая задержка, когда cURL вернет первый байт (возможно, кеширование?).

Еще одна возможность, в которой я не совсем уверен (может зависеть от конфигурации прокси-сервера и заголовков ответов, отправляемых API), - это когда прокси-сервер фактически отправляет данные обратно. Возможно, потребуется загрузить весь HTTP-ответ или начать отправлять заголовки и данные по мере их чтения. Это может привести к некоторым потенциально значительным различиям в ваших расчетах.

В конечном счете, я думаю, что суть в том, что у вас нет подробной информации о соединении с прокси, нет способа узнать или точно аппроксимировать, сколько времени понадобилось для подключения прокси к API, и сколько времени потребовалось, чтобы получить ответ. В противном случае вы правы, что TOTAL - STARTTRANSFER - ваше лучшее приближение для времени отклика, если вы используете прокси.

Не зная точно, что вы пытаетесь сделать и почему, возможно, вам лучше всего арендовать некоторые VPS или облачные экземпляры в разных географических точках для запуска некоторых экземпляров PHP с использованием cURL для прямого подключения к API, чтобы у вас был доступ ко всем метрики, которые вы ищете.

Другие вопросы по тегам