关于并发curl的疑问

我使用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差不多甚至更快一点,所以是浏览器远程访问占用了网速的原因?

阅读 1.7k
1 个回答

浏览器访问是会慢一点,不过应该也不会慢那么多。占用网速更不可能了。你如果想知道可以使用xhprof这个试试

推荐问题