什么测试工具可以压力测试HTTPS POST的?

hawkyoung 发布于 2012/11/19 11:59
阅读 7K+
收藏 6

嘿嘿,跟 @红薯 老大的号召没关系。是我们最近要对自己的一个数据服务器进行测试,HTTPS证书是自签名的,post报文里头有若干个参数。

我看好多测试工具都只支持get,或者不支持HTTPS,支持HTTPS也不知道认证这块会不会有问题。不知道各位前辈有没有推荐的?

加载中
0
mallon
mallon
写个脚本调curl
0
jeffsui
jeffsui
jmeter不行吗?
hawkyoung
hawkyoung
可以支持https以及自己土产的证书,谢谢哥们。不过post参数要每次请求不一样(例如id),我还在研究
0
宏哥
宏哥

直接给出php的代码, 可以自行在options添加 header, 增加 cookie .

<?php defined('SYSPATH') or die('No direct script access.');
/**
 * Provides http server communications options using [Stream]
 * Mainly used to communiated with http
 * Add Support HTTP/1.1 by Default
 * Only Support Connection Close Mode
 *
 * @author     anthony 
 */
class Http {

	/**
	 * @var  array  default header options
	 */
	public static $default_options = array (
			'User-Agent'=> 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4',
			'Connection'=> 'Close' //Need to close the request every time for HTTP 1.1
		);

	/**
	 * return Array lines of headers
	 * Overwrite by $options
	 *
	 * @param Array $options, key value pairs of Header options
	 * 
	 * @return Array,Array line of headers
	 */
	private static function getHeaders($options){
		if ($options === NULL) {
			// Use default options
			$options = self::$default_options;
		} else {
			//Merge the $options with $default_options, if the value set in $options,
			//Value in $default_options will be overwrite
			$options =$options + self::$default_options ;
		}

		$headers = array();
		foreach($options as $k=>$v){
			$headers[] = $k.': '.$v;
		}

		return $headers;
	}

	/**
	 * Returns the output of a http URL. 
	 * may be used.
	 *
	 * @param   string   http base URL or FULL url
	 * @param   array    Header options
	 * @param   array $data Get Param
	 * @param   array &$reponse header, if Assigned,the response header will be populated
	 *
	 * @return  string, Raw String of Http body
	 */
	public static function get($url, array $options = NULL,$data = NULL,&$response_header = NULL) {
		$headers = self::getHeaders($options);
		$params = array('http' => array(
			'method' => 'GET',
			//Defautl HTTP 1.1 and with Connection Close
			'protocol_version'=>'1.1'
		));

		if ($options!== null) {
			$params['http']['header'] = $headers;
		}

		if($data){
			$url .= '?'.http_build_query($data); 
		}
		$ctx = stream_context_create($params);
		$fp = fopen($url, 'rb', false, $ctx);
		if (!$fp) {
			throw new Exception("Connection failed: $url");
		}

		if($response_header !== NULL){
			$response_header = stream_get_meta_data($fp);
		}

		$response = stream_get_contents($fp);
		if ($response === false) {
			throw new Exception("Reading data Failed: $url");
		}
		fclose($fp);
		return $response;
	}

	/**
	 * Post with request options and data 
	 *
	 * @param String url, FULL url
	 * @param Array $options , key=>value pairs array
	 * @param Array $data ,Post Data pairs
	 * @param   array &$reponse header, if Assigned,the response header will be populated
	 *
	 * @return  string, Raw String of Http body
	 */
	public static function post($url,  $options = null,$data=NULL,&$response_header = NULL) {
		//Restricted the Form formate
		if(is_array($data)){
			$data = http_build_query($data);
		}
		
		$options['Content-type'] = 'application/x-www-form-urlencoded';
		$options['Content-Length'] = strlen($data);

		$params = array('http' => array(
			'method' => 'POST',
			'content' => $data
		));

		$headers = self::getHeaders($options);
		$params['http']['header'] = $headers;

		$ctx = stream_context_create($params);
		$fp = fopen($url, 'rb', false, $ctx);
		if (!$fp) {
			throw new Exception("Connection Failed: $url ");
		}

		if($response_header !== NULL){
			$response_header = stream_get_meta_data($fp);
		}

		$response = stream_get_contents($fp);
		if ($response === false) {
			throw new Exception("Reading data failed: $url");
		}
		fclose($fp);
		return $response;
	} 

	/**
	 * Inflate zipped content
	 *
	 * @param String $_content, gzipped content
	 *
	 * @return String, Inflated content
	 */
	public static function inflate($_content){
		//deflate add 10 charaters before inflate format and 8 charaters checksum append
		//gzdecode is not availible for ALL PHP even gzencode is avalible
		$_content = substr($_content, 10,-8); 
		return gzinflate($_content);

	}

	/**
	 * Check if the reponse content is zipped from response header
	 *
	 * @param Array $_response_header, Response header captured from get/post
	 *
	 * @return Boolean, True for zipped contented
	 */
	public static function isZipped($_response_header){
		if (preg_grep('/^Content-Encoding:\s*gzip/',$_response_header['wrapper_data'])){
			return TRUE;
		}else{
			return False;
		}
	}
} // End http
宏哥
宏哥
回复 @大东哥 : 这个, 根本无所谓.
大东哥
大东哥
回复 @宏哥 : 你试试呗,叫楼主给你最佳答案吧。
宏哥
宏哥
回复 @大东哥 : 我现在在防火墙后面. 如果红薯不block我的话, 用这个类一下就可以把osc刷爆掉. 不过这种游戏太小儿科了, 没有什么意思而已.
宏哥
宏哥
回复 @大东哥 : 这个无缝支持https.
大东哥
大东哥
人家问的是https。
0
宏哥
宏哥
宏哥
回复 @大东哥 : 这就是我自己在实际当中使用的代码. 你这个家伙, 就不会花5分钟测试一下吗? 还有比这个更简单的代码吗? 哎, 怎么说你呢
大东哥
大东哥
就针对你贴的上面这段代码,你确定?
0
宏哥
宏哥

回复 @大东哥 :  再教训你一下, 不听宏哥的话, 现在慢慢就知道了.

你学的那些玩意, 怎么说呢, 都说过了. 完整的调用代码, 不带数据.可以在第三个参数增加post数据,

格式为 key => value的数组.

 如果这样还看不懂, 我只能说, 

你被java以及那些框架垃圾搞废了:

南湖船老大
南湖船老大
围观phper
宏哥
宏哥
回复 @大东哥 : 自己的路, 自己走, 自己担当,你要怎么折腾,别人又无所谓.
大东哥
大东哥
怎么说都行,反正做web我只会用java,并且尽量用框架。
皮总
皮总
支持
宏哥
宏哥
回复 @大东哥 : 骗自己很容易, 骗别人就难了, 骗到钱, 就更难.
下一页
0
曾建凯
曾建凯

引用来自“宏哥”的答案

回复 @大东哥 :  再教训你一下, 不听宏哥的话, 现在慢慢就知道了.

你学的那些玩意, 怎么说呢, 都说过了. 完整的调用代码, 不带数据.可以在第三个参数增加post数据,

格式为 key => value的数组.

 如果这样还看不懂, 我只能说, 

你被java以及那些框架垃圾搞废了:

说得好,潜水也要出来支持 @宏哥 一下,哈哈!

0
八月下沙
八月下沙

http://www.oschina.net/p/siege

这个用来测POST是没有问题的,https不确定,你看下文档,用起来还算方便

0
foxidea
foxidea

自己可以写个多线程程序 C#中 有webclient 可以执行 post get 请求

win7 下 http 并发数量有限制 大概是 64 个进程

如果想模拟更多的 post 并发请求,可以用 windows server 

0
hawkyoung
hawkyoung

各位:

我目前采用jmeter进行了压力测试,图形界面,跨平台,教程很多,比ab好用而且功能强大(ab我至今没调通它的post)。可以支持一次post若干个参数,支持定义每次post的内容不一样(例如userid随机)。SSL证书是自己签名的也没关系。

在1000并发的时候服务器报告大量的SSL认证失败问题,估计这里有瓶颈,还在调试。


宏哥的代码我仔细看了,有空一定会试试,这能跑php的空间站点都可以成压力测试别人的武器了,嘿嘿

0
宏哥
宏哥

引用来自“hawkyoung”的答案

各位:

我目前采用jmeter进行了压力测试,图形界面,跨平台,教程很多,比ab好用而且功能强大(ab我至今没调通它的post)。可以支持一次post若干个参数,支持定义每次post的内容不一样(例如userid随机)。SSL证书是自己签名的也没关系。

在1000并发的时候服务器报告大量的SSL认证失败问题,估计这里有瓶颈,还在调试。


宏哥的代码我仔细看了,有空一定会试试,这能跑php的空间站点都可以成压力测试别人的武器了,嘿嘿

宏哥的代码使用起来非常简单. 估计没有更简单的了.

http://www.oschina.net/question/96003_79938

一个例子.

https 只需要将url里面http换成https即可. 完全透明.

返回顶部
顶部