pycurl检测网站性能,pycurl.*_TIME时间问题

来源:互联网 发布:php商城开发流程 编辑:程序博客网 时间:2024/06/07 05:49

今天使用python+pycurl来检测网站性能,使用curl_obj.getinfo(pycurl.*_TIME)来获取各个阶段运行时间

total_time = curl_obj.getinfo(pycurl.TOTAL_TIME)#传输结束所消耗的总时间dns_time = curl_obj.getinfo(pycurl.NAMELOOKUP_TIME)#从发起请求到DNS解析完成所消耗的时间connect_time = curl_obj.getinfo(pycurl.CONNECT_TIME)#从发起请求到建立连接所消耗的时间redirect_time = curl_obj.getinfo(pycurl.REDIRECT_TIME)#从发起请求到重定向所消耗的时间ssl_time = curl_obj.getinfo(pycurl.APPCONNECT_TIME)    #从发起请求到SSL建立握手时间pretrans_time = curl_obj.getinfo(pycurl.PRETRANSFER_TIME)#从发起请求到准备传输所消耗的时间starttrans_time = curl_obj.getinfo(pycurl.STARTTRANSFER_TIME)   #从发起请求到接收第一个字节的时间

最后发现,dns_time+connect_time+......+starttrans_time远远大于total_time。

查看man curl(pycurl基于curl开发的),发现各个阶段时间是从客户端发起URL请求时到某个阶段的时间差,而不是某个阶段开始时间到结束时间差。


为了求得某个阶段的执行时间,需要对这些值进行计算。

pycurl的各个阶段(根据pycurl.*_TIME统计)依次为

DNS解析-->TCP连接-->跳转【如有】-->SSL握手【如有】-->客户端准备-->服务器响应-->数据传输


代码如下:

#! /usr/bin/python#coding:utf-8#-*- coding : utf-8 -*-import sys,pycurlrequest_url = sys.argv[1]curl_obj = pycurl.Curl()#创建一个curl对象curl_obj.setopt(pycurl.CONNECTTIMEOUT, 5)#连接的等待时间,设置为0则不等待curl_obj.setopt(pycurl.TIMEOUT, 5)#最大下載时间curl_obj.setopt(pycurl.NOPROGRESS, 1)#是否屏蔽下载进度条,非0则屏蔽curl_obj.setopt(pycurl.MAXREDIRS, 0)   #指定HTTP重定向的最大数curl_obj.setopt(pycurl.FORBID_REUSE, 1)#完成交互后强制断开连接,不重用curl_obj.setopt(pycurl.FRESH_CONNECT,1)#强制获取新的连接,即替代缓存中的连接curl_obj.setopt(pycurl.DNS_CACHE_TIMEOUT,1)#设置保存DNS信息的时间,默认为120秒curl_obj.setopt(pycurl.URL,request_url)#指定请求的URLimport StringIOstrio = StringIO.StringIO()curl_obj.setopt(pycurl.WRITEFUNCTION, strio.write)try :    curl_obj.perform()    err_mess = ''except Exception as e:    err_mess = str(e)#访问页面total_time = curl_obj.getinfo(pycurl.TOTAL_TIME)#传输结束所消耗的总时间dns_time = curl_obj.getinfo(pycurl.NAMELOOKUP_TIME)#从发起请求到DNS解析完成所消耗的时间connect_time = curl_obj.getinfo(pycurl.CONNECT_TIME)#从发起请求到建立连接所消耗的时间redirect_time = curl_obj.getinfo(pycurl.REDIRECT_TIME)#从发起请求到重定向所消耗的时间ssl_time = curl_obj.getinfo(pycurl.APPCONNECT_TIME)    #从发起请求到SSL建立握手时间pretrans_time = curl_obj.getinfo(pycurl.PRETRANSFER_TIME)#从发起请求到准备传输所消耗的时间starttrans_time = curl_obj.getinfo(pycurl.STARTTRANSFER_TIME)   #从发起请求到接收第一个字节的时间print '发起请求到DNS解析时间 : %.3f ms' %(dns_time*1000)print '发起请求到TCP连接完成时间: %.3f ms' %(connect_time*1000)print '发起请求到跳转完成时间: %.3f ms' %(redirect_time*1000)print '发起请求到SSL建立完成时间 : %.3f ms' %(ssl_time*1000)print '发起请求到客户端发送请求时间: %.3f ms' %(pretrans_time*1000)print '发起请求到客户端接受首包时间: %.3f ms' %(starttrans_time*1000)print '总时间为: %.3f ms' %(total_time*1000)print ''transfer_time = total_time - starttrans_time#传输时间serverreq_time = starttrans_time - pretrans_time#服务器响应时间,包括网络传输时间if ssl_time == 0 :    if redirect_time == 0 :        clientper_time = pretrans_time - connect_time        #客户端准备发送数据时间        redirect_time = 0    else :        clientper_time = pretrans_time - redirect_time        redirect_time = redirect_time - connect_time    ssl_time = 0else :    clientper_time = pretrans_time - ssl_time        if redirect_time == 0 :        ssl_time = ssl_time - connect_time        redirect_time = 0    else :        ssl_time = ssl_time - redirect_time        redirect_time = redirect_time - connect_timeconnect_time = connect_time - dns_timeprint '发起请求到DNS解析时间 : %.3f ms' %(dns_time*1000)print 'TCP连接消耗时间 : %.3f ms' %(connect_time*1000)print '跳转消耗时间: %.3f ms' %(redirect_time*1000)print 'SSL握手消耗时间 : %.3f ms' %(ssl_time*1000)print '客户端发送请求准备时间: %.3f ms' %(clientper_time*1000)print '服务器处理时间: %.3f ms' %(serverreq_time*1000)print '数据传输时间: %.3f ms' %(transfer_time*1000)

经过多次测试,终于dns_time+connect_time+......+starttrans_time=total_time

1 0