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

标签 curl proxy libcurl

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

  • 代理连接到 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 Documentation很有帮助,但我不确定如何使用文档中的相关部分回答我上面的问题:
    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 (???)
    

    这是一个 chart HTTP 代理的工作原理。上面的 CURLINFO_*_TIME 项目在哪里适合这个图表?

    HTTP Proxies

    最佳答案

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

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

    没有办法知道单独从 HTTP/SOCKS 代理单独执行这些步骤中的任何一个需要多长时间。

    您唯一能准确知道的是所有这些操作的总和 ( CURLINFO_TOTAL_TIME - CURLINFO_STARTTRANSFER_TIME )。我想甚至有可能从代理完成请求到 cURL 取回第一个字节(可能是缓存?)之间存在轻微的延迟。

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

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

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

    关于curl - 如何使用 CURLINFO_*_TIME 值估算 cURL 请求的代理连接时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33613831/

    相关文章:

    c - 从缓冲区 C 读取

    c - libcurl 对多个并发请求使用 1 个连接

    c - 试图弄清楚如何通过 c 中的 lib curl 发送 json 数据

    php CURL 不适用于动态 URL

    python - 如何将 cURL 翻译成 Python 请求语言?

    proxy - Notepad++ 插件管理器的服务器 URL 是什么?

    nginx - IP 和 Nginx 作为反向代理时出错

    python - 如何使用 Selenium 和 Python 启动 Tor 浏览器

    javascript - 使用 XMLHTTP JavaScript 通过 cURL PHP 接收参数

    git - git push origin master 上出现错误 - 错误 : RPC failed; curl 56 SSL read: error:00000000:lib(0):func(0):reason(0), errno 10053 fatal: