账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    使用curl_multi_exec做并发请求,提高并发数后报段错误的问题
    44
    0

    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);

    并没有效果

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 鱼刀 普通会员 1楼

      在使用curl_multi_exec做并发请求时,如果并发数增加后出现报段错误,可能有以下几种可能的原因:

      1. 网络问题:首先,我们需要检查网络连接。如果网络连接不稳定,可能会导致响应速度变慢,从而影响并发请求的执行效率。你可以尝试增加网络带宽,或者检查网络状态,确保网络连接正常。

      2. 请求超时:如果你的并发请求需要等待响应时间较长,而网络连接不稳定或请求耗时过长,可能会导致多条请求同时等待响应,从而导致服务器无法正确处理所有请求。你可以尝试设置并发请求的超时时间,或者通过客户端设置请求超时。

      3. 响应超时:在处理响应时,如果服务器在处理请求时出现了错误,例如返回了错误状态码,可能会导致请求执行失败。你需要检查服务器返回的错误代码,以及错误消息,以便确定问题的原因。如果错误消息中包含错误信息,可以尝试在发送请求之前发送一个适当的HTTP请求,以检查服务器是否能正确处理错误。

      4. curl_multi_exec函数设置问题:在使用curl_multi_exec函数时,可能需要正确设置多线程和线程池的大小。如果线程池的大小设置得过大,可能会导致过多的线程同时运行,从而影响并发请求的执行效率。你可以尝试调整线程池的大小,以确保线程的合理使用。

      5. curl_multi_exec函数的优先级设置问题:在多线程环境下,如果多个线程同时执行curl_multi_exec函数,可能会导致优先级的冲突。你可能需要设置curl_multi_exec函数的优先级,以确保它在等待响应时具有最高的优先级。

      6. curl_multi_exec函数的错误处理机制问题:在处理curl_multi_exec函数返回的错误结果时,需要正确处理可能的错误。如果curl_multi_exec函数返回的错误状态码表示某个请求失败,你需要根据错误状态码处理请求失败,而不是将所有请求都阻塞。你可以检查curl_multi_exec函数返回的错误状态码,并根据错误状态码执行相应的处理代码。

      7. curl_multi_exec函数的并发调用机制问题:在使用curl_multi_exec函数时,可能需要正确处理多线程的并发调用。如果多线程同时调用curl_multi_exec函数,可能会导致执行效率下降。你需要检查curl_multi_exec函数的并发调用机制,以确保在并发调用时正确执行所有请求。

      总之,提高并发数后出现报段错误,需要仔细检查网络、请求超时、响应超时、curl_multi_exec函数设置、优先级设置、错误处理机制和并发调用机制等问题,以找出问题的根本原因,并针对性地进行解决。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部