Как приблизительное время соединения прокси-сервера для запроса cURL, используя значения CURLINFO_*_TIME?
Ниже приведен небольшой набор данных, из которого я пытаюсь ответить на два вопроса:
- Сколько времени понадобилось прокси для подключения к серверу API?
- Сколько времени занял запрос 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, чтобы у вас был доступ ко всем метрики, которые вы ищете.