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计时器?如果是这样,他们会去哪里?
你应该使用pycurl,而不是urllib2
安装pyCurl:
您可以使用pip/easy_install,或者从源代码安装它.
easy_install pyCurl
也许你应该是超级用户.
用法:
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)使用您当前的open/read对,只有一个可能的时间点 - 两者之间。
该open()调用应该负责实际发送 HTTP 请求,并且应该(据我所知)在发送后立即返回,准备好让您的应用程序通过read().
从技术上讲,较长的服务器响应可能会使您的应用程序在调用 时阻塞read(),在这种情况下,这不是 TTFB。
但是,如果数据量很小,那么 TTFB 和 TTLB 之间就没有太大区别。对于大量数据,只需测量read()返回第一个可能的最小块需要多长时间。