获取HTTP请求的TTFB(第一个字节的时间)

Cor*_*erg 6 python http urllib2

这是一个加载url并捕获响应时间的python脚本:

import urllib2
import time

opener = urllib2.build_opener()
request = urllib2.Request('http://example.com')

start = time.time()
resp = opener.open(request)
resp.read()
ttlb = time.time() - start
Run Code Online (Sandbox Code Playgroud)

由于我的计时器包裹在整个请求/响应(包括read()),这将给我TTLB(时间到最后一个字节).

我还想获得TTFB(第一个字节的时间),但我不知道从哪里开始/停止我的计时.urllib2是否足以让我添加TTFB计时器?如果是这样,他们会去哪里?

kre*_*ats 7

你应该使用pycurl,而不是urllib2

  1. 安装pyCurl:
    您可以使用pip/easy_install,或者从源代码安装它.

    easy_install pyCurl

    也许你应该是超级用户.

  2. 用法:

    import pycurl
    import sys 
    import json
    
    WEB_SITES = sys.argv[1]
    
    def main():
        c = pycurl.Curl()
        c.setopt(pycurl.URL, WEB_SITES)              #set url
        c.setopt(pycurl.FOLLOWLOCATION, 1)  
        content = c.perform()                        #execute 
        dns_time = c.getinfo(pycurl.NAMELOOKUP_TIME) #DNS time
        conn_time = c.getinfo(pycurl.CONNECT_TIME)   #TCP/IP 3-way handshaking time
        starttransfer_time = c.getinfo(pycurl.STARTTRANSFER_TIME)  #time-to-first-byte time
        total_time = c.getinfo(pycurl.TOTAL_TIME)  #last requst time
        c.close()
    
        data = json.dumps({'dns_time':dns_time,         
                           'conn_time':conn_time,        
                           'starttransfer_time':starttransfer_time,    
                           'total_time':total_time})
        return data
    
    if __name__ == "__main__":    
        print main()
    
    Run Code Online (Sandbox Code Playgroud)


Aln*_*tak 2

使用您当前的open/read对,只有一个可能的时间点 - 两者之间。

open()调用应该负责实际发送 HTTP 请求,并且应该(据我所知)在发送后立即返回,准备好让您的应用程序通过read().

从技术上讲,较长的服务器响应可能会使您的应用程序在调用 时阻塞read(),在这种情况下,这不是 TTFB。

但是,如果数据量很小,那么 TTFB 和 TTLB 之间就没有太大区别。对于大量数据,只需测量read()返回第一个可能的最小块需要多长时间。