【问题标题】:Timings of cURL request by getting details from curl_getinfo()通过从 curl_getinfo() 获取详细信息的 cURL 请求时间
【发布时间】:2016-12-10 04:53:25
【问题描述】:

我写了一个小脚本来诊断我的网站的连接时间,结果如下:

Lookup time:                0.6454ms
Connect time:               1.1611ms
Pretransfer time:           1.1615ms
Redirect time:              0ms
Time to 1st Byte time:      43.397ms
Total time:                 43.445ms

使用的代码如下:

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if(curl_exec($ch) !== false) {
    $info = curl_getinfo($ch);
    echo 'Lookup time: ' . "\t\t" . ($info['namelookup_time'] * 1000) . 'ms' . PHP_EOL;
    echo 'Connect time: ' . "\t\t" . ($info['connect_time'] * 1000) . 'ms' . PHP_EOL;
    echo 'Pretransfer time: ' . "\t" . ($info['pretransfer_time']) . 'ms' . PHP_EOL;
    echo 'Redirect time: ' . "\t\t" . ($info['redirect_time'] * 1000) . 'ms' . PHP_EOL;
    echo 'Time to 1st Byte time: ' . "\t" . ($info['starttransfer_time'] * 1000) . 'ms' . PHP_EOL;
    echo 'Total time: ' . "\t\t" . ($info['total_time'] * 1000) . 'ms' . PHP_EOL;
} else {
    echo 'Error: ' . curl_error($ch);
}
curl_close($ch);

我不太明白上面的结果。

  1. 为什么到第一个字节的时间 (TTFB) 时间等于总时间?
  2. 上述时间是否累积?如果是,传输时间等于0ms?
  3. 预传输时间是什么意思?

curl_getinfo($ch) 的输出:

Array
(
    [url] => http://www.example.com/apply.php
    [content_type] => text/html
    [http_code] => 302
    [header_size] => 412
    [request_size] => 88
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.043445
    [namelookup_time] => 0.006454
    [connect_time] => 0.011611
    [pretransfer_time] => 0.011615
    [size_upload] => 0
    [size_download] => 0
    [speed_download] => 0
    [speed_upload] => 0
    [download_content_length] => 0
    [upload_content_length] => 0
    [starttransfer_time] => 0.043397
    [redirect_time] => 0
    [certinfo] => Array
        (
        )

    [redirect_url] => http://www.example.com/index.php
)

【问题讨论】:

  • 那么curl_getinfo() 在您的代码中到底在哪里使用?
  • 哎呀,对不起。我在复制和粘贴期间错过了一行。编辑了问题。

标签: php performance curl time


【解决方案1】:
  • 为什么到第一个字节的时间 (TTFB) 时间等于总时间?

这取决于总数据。如果您传输的总数据几乎为零,那么它将是相等的。

  • 上述时间是否累积?如果是,传输时间等于0ms?

是的,它是累积的。如果数据很大,那么它会增加。

  • 预传输时间是什么意思?

预传输时间是指从开始到文件传输开始之前的时间(以秒为单位)

欲了解更多信息Curl GetInfo

这也取决于您的连接速度。

您还应该检查此值。

  1. CURLINFO_SIZE_UPLOAD - 上传的总字节数
  2. CURLINFO_SIZE_DOWNLOAD - 下载的字节总数
  3. CURLINFO_SPEED_DOWNLOAD - 平均下载速度
  4. CURLINFO_SPEED_UPLOAD - 平均上传速度

这样您就会了解您的速度和数据大小。

更新:

通过您更新的输出,我们可以清楚地了解到几乎没有数据被上传和下载。所以现在时机更有意义。

【讨论】:

  • 但总数据至少有1KB,可能无法在0ms内完成传输(总时间-TTFB)
  • @Raptor:检查更新的答案并使用更新的数据更新您的问题
【解决方案2】:

不要花时间对请求进行任何彻底的分析。 0ms0.5ms 对于计算机来说是不同的年龄;阅读原始数字以避免混淆。

1) 如果 HTTP 请求返回单个资源(而不是完整的网页),则 TTFB 和 Total Time 都是相同的东西,除非服务器返回的数据量要大得多。

2) 是的,它是累积的。增加URL返回的数据量,你会看到传输时间也会从0ms开始增加

3) 接受请求后等待服务器响应的时间

【讨论】:

  • 感谢您的回复。但是,我的网站包含图像、外部 CSS 和 JS 以及大量文本。 cURL 信息也可以获取这些的加载时间吗?这可以认为是“数据量相当大”吗?
  • 由于您只请求了一个资源,即使网页上列出了其他资源,它们也没有被调用。在发送第一个字节的同时返回给您的客户端的所有文本/html。如果您只是为了测试而使 HTML 变长,则 TTFB 将开始与 Total time 不同
  • cURL 是否有可能包含网站中的所有内容(CSS、JS、图像等)?或者我必须寻找替代解决方案,比如 PhantomJS / CasperJS ?
  • 它自己不能。如果您继续使用 cURL,您将不得不在后续调用中获取这些资源
  • 如果您使用curl_getinfo() 的完整输出编辑您的问题,它可能会使答案更加具体,并且讨论更有趣,因为没有四舍五入您会注意到差异;即使可以忽略不计
猜你喜欢
  • 2018-07-30
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 2018-03-27
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多