使用curl_multi_exec做并发请求,提高并发数后报段错误的问题

php代码如下

    $chlist = [];
    foreach($requestList as $k=>$v){
        $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", 
        ));
        $strPost = encode($v['params']);
        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);

    //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($end - $start);exit;
    //var_dump($response);
    return $response;

代码放在服务器上,使用命令行执行,这里的$requestList数组可以根据命令行的参数生成对应数量的数组
我测试php index.php 500或者php index.php 1000都是正常的,但当我提高到php index.php 2000时,命令行提示段错误,这是什么原因导致的?与服务器性能是否相关?
百度找到了这篇文章,但尝试添加

curl_setopt ( $ch,  CURLOPT_NOSIGNAL,true);

并没有效果

阅读 2.9k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题