如何使用 CURLINFO_*_TIME 值估算 cURL 请求的代理连接时间?

问题描述 投票:0回答:2

下面是一个小数据集,我试图从中回答两个问题:

  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 项目适合此图表中的什么位置?


(来源:thousandeyes.com

curl proxy libcurl
2个回答
2
投票

我认为没有任何方法可以准确计算您正在寻找的内容。

cURL 连接到代理,发送请求并等待响应。代理在时间上所做的一切(它自己的 DNS 解析、连接到主机、发送(代理)请求、等待回复、读取回复并将其代理回来)对于 cURL 来说都是一个黑匣子。

仅通过 HTTP/SOCKS 代理无法知道这些步骤单独花费了多长时间。

您唯一可以准确了解的是所有这些操作的总和 (

CURLINFO_TOTAL_TIME - CURLINFO_STARTTRANSFER_TIME
)。我想,从代理完成请求到 cURL 取回第一个字节(也许是缓存?),甚至可能会有轻微的延迟。

我不太确定的另一种可能性(可能取决于代理配置和 API 发送的响应标头)是代理实际发送回数据的时间。它可能需要下载整个 HTTP 响应,或者可能在读取标头和数据时开始发送它们。这可能会导致您的计算出现一些潜在的重大差异。

最终,我认为底线是因为您没有来自代理的连接详细信息,无法知道或准确估计代理连接到 API 花费了多长时间,以及获得响应需要多长时间。否则,如果您使用代理,那么 TOTAL - STARTTRANSFER 是响应时间的最佳近似值,您是正确的。

在不确切知道您要做什么或为什么这样做的情况下,也许您最好的选择是在不同地理位置租用一些 VPS 或云实例来运行一些 PHP 实例,使用 cURL 直接连接到 API,这样您就可以访问所有您正在寻找的指标。


0
投票

我使用%{time_connect}和%{time_starttransfer}和%{time_total},但我认为这是测量客户端和服务器之间的时间。代理非常透明。

curl -v -w "Connect: %{time_connect} TTFB: %{time_starttransfer} Total time: %{time_total} \n" -U 'user:pwd' -x 'proxy.example.com:7777' -H "<HEADER>" "<URL>"
© www.soinside.com 2019 - 2024. All rights reserved.