鍍金池/ 問答/PHP  HTML/ 關(guān)于并發(fā)curl的疑問

關(guān)于并發(fā)curl的疑問

我使用curl_multi_init及一系列相關(guān)方法想來實現(xiàn)對接口的并發(fā)壓力測試,curl的代碼放在a服務器上,測試的接口放在b服務器上。兩臺服務器是內(nèi)網(wǎng)。
我的測試代碼大致如下

$chlist = [];
    foreach($requestList as $k=>$v){// 遍歷并發(fā)數(shù)組測試時為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", 
        ));
        // 拼接參數(shù)
        $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);// 參數(shù)加密
        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);// 開始調(diào)用接口時間
    // 執(zhí)行批處理句柄
    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);// 停止調(diào)用接口時間
    var_dump($end - $start);// 接口調(diào)用花費時間

    //4.關(guān)閉子curl
    foreach($chlist as $val){
        curl_multi_remove_handle($mh, $val);
        $response[] = curl_multi_getcontent($val);
    }
    //5.關(guān)閉父curl
    curl_multi_close($mh);
    //var_dump($response);
    return $response;

但我在懷疑這樣的測試是否準確?我看了測試程序運行時a服務器的top,占用是沒滿的,但我測試出來的結(jié)果至少需要十幾秒,而接口的開發(fā)者使用apache jmeter測試500個并發(fā),只要5秒,這是什么原因?

我又試了一下,我之前開測試代碼是用瀏覽器訪問代碼地址,現(xiàn)在換成命令行執(zhí)行,速度明顯縮短,和apache jmeter差不多甚至更快一點,所以是瀏覽器遠程訪問占用了網(wǎng)速的原因?

回答
編輯回答
尐懶貓

瀏覽器訪問是會慢一點,不過應該也不會慢那么多。占用網(wǎng)速更不可能了。你如果想知道可以使用xhprof這個試試

2017年4月2日 01:41