我使用curl_multi_init及一系列相关方法想来实现对接口的并发压力测试,curl的代码放在a服务器上,测试的接口放在b服务器上。两台服务器是内网。
我的测试代码大致如下
$chlist = [];
foreach($requestList as $k=>$v){// 遍历并发数组测试时为500个
$chlist[$k]=curl_init();
curl_setopt($chlist[$k], CURLOPT_URL, $sysConfig['apiUrl']);// 接口地址
curl_setopt($chlist[$k], CURLOPT_RETURNTRANSFER, 1);
curl_setopt($chlist[$k], CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($chlist[$k], CURLOPT_HTTPHEADER, array('Accept-Encoding:gzip'));
curl_setopt($chlist[$k], CURLOPT_ENCODING, "gzip");
curl_setopt($chlist[$k], CURLOPT_HTTPHEADER, array (
"Content-Type: application/x-www-form-urlencoded; charset=gbk",
));
// 拼接参数
$reqXml = '<Req funcid="9999"><![CDATA['.parameHandle($v['params'],$apilist[$v['api']]['paramsType']).']]></Req>';
$seKey = getRndString();
$dateKey = getDateString();
$strPost = encode($reqXml, $sysConfig['key'], $sysConfig['version'], $sysConfig['chan_code'], $seKey, $dateKey);// 参数加密
curl_setopt ( $chlist[$k], CURLOPT_POSTFIELDS, $strPost );
curl_setopt($chlist[$k], CURLOPT_TIMEOUT,120);
}
$mh = curl_multi_init();
foreach($chlist as $k=>$v) {
curl_multi_add_handle($mh,$v);
}
$active = null;
$start=time();
var_dump($start);// 开始调用接口时间
// 执行批处理句柄
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
$end = time();
var_dump($end);// 停止调用接口时间
var_dump($end - $start);// 接口调用花费时间
//4.关闭子curl
foreach($chlist as $val){
curl_multi_remove_handle($mh, $val);
$response[] = curl_multi_getcontent($val);
}
//5.关闭父curl
curl_multi_close($mh);
//var_dump($response);
return $response;
但我在怀疑这样的测试是否准确?我看了测试程序运行时a服务器的top,占用是没满的,但我测试出来的结果至少需要十几秒,而接口的开发者使用apache jmeter测试500个并发,只要5秒,这是什么原因?
我又试了一下,我之前开测试代码是用浏览器访问代码地址,现在换成命令行执行,速度明显缩短,和apache jmeter差不多甚至更快一点,所以是浏览器远程访问占用了网速的原因?
浏览器访问是会慢一点,不过应该也不会慢那么多。占用网速更不可能了。你如果想知道可以使用xhprof这个试试