循环中curl请求

遇到一个需要大循环中curl请求接口情况,循环请求接口特别耗时,

然后想着优化,curl中用curl_multi_init函数可实现批量请求,没成想优化是优化了,不顶用啊

发现少量请求时用curl_multi_ini是ok的,五条请求都返回成功,而五千请求就才成功了两百多条,而单纯的curl耗时长却都成功了
在这里插入图片描述

无所谓,实现了就好,最终结果都是为了确保在循环中请求都能成功。

其中用单纯的curl的关键在于,

兄台,自己看吧

  public function multiCurl($url, $data) {
        $queue = curl_multi_init();
        foreach($data as $info) {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_TIMEOUT, 3);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $info);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_NOSIGNAL, true);
            curl_multi_add_handle($queue, $ch);
        }

        $responses = array();
        do {
            while (($code = curl_multi_exec($queue, $active)) == CURLM_CALL_MULTI_PERFORM) ;
            if ($code != CURLM_OK) { break; }
            while ($done = curl_multi_info_read($queue)) {
                $results = curl_multi_getcontent($done['handle']);
                $responses[] = $results;
                curl_multi_remove_handle($queue, $done['handle']);
                curl_close($done['handle']);
            }
            if ($active > 0) {
                curl_multi_select($queue, 0.5);
            }
        } while ($active);
        curl_multi_close($queue);
        return json_encode($responses);
    }

    public function file_get_contents_curl($url, $postData='', $header='',$options = []){
        if(!extension_loaded('curl'))  return 'curl extension not loaded';

        $defaultOptions = [
            'timeout' => 10
        ];
        $options += $defaultOptions;

        $ch = curl_init();
        if($header){
            curl_setopt ( $ch, CURLOPT_HTTPHEADER, $header );
        }
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
        curl_setopt($ch,CURLOPT_HEADER,false);
        curl_setopt($ch,CURLOPT_TIMEOUT,$options['timeout']);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);

        if(!empty($postData)){//post传递
            curl_setopt($ch,CURLOPT_POST,1);
            curl_setopt($ch,CURLOPT_POSTFIELDS,$postData);
        }
        $str = curl_exec($ch);
        $err = curl_error($ch);

        if (false === $str || !empty($err)) {
            $errno = curl_errno($ch);
            curl_close($ch);
            return 'Errno:' . $errno . ';ErrInfo:' . $err;
        } else {
            curl_close($ch);
            return trim($str);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++,可以使用libcurl库来发起异步请求。libcurl提供了一个易于使用的多接口功能,可以同时处理多个传输。其,使用curl_multi_add_handle()函数向curl_multi句柄添加一个新的curl_easy_handle,从而实现异步请求。 下面是一个简单的示例代码,用于发起异步请求: ``` #include <curl/curl.h> int main() { CURL *easy_handle = curl_easy_init(); CURLM *multi_handle = curl_multi_init(); int still_running = 0; curl_easy_setopt(easy_handle, CURLOPT_URL, "https://www.example.com/"); curl_easy_setopt(easy_handle, CURLOPT_FOLLOWLOCATION, 1L); curl_multi_add_handle(multi_handle, easy_handle); curl_multi_perform(multi_handle, &still_running); while (still_running) { struct timeval timeout; int rc; fd_set fdread; fd_set fdwrite; fd_set fdexcep; int maxfd = -1; long curl_timeo = -1; curl_multi_timeout(multi_handle, &curl_timeo); if(curl_timeo >= 0) { timeout.tv_sec = curl_timeo / 1000; timeout.tv_usec = (curl_timeo % 1000) * 1000; } else { timeout.tv_sec = 1; timeout.tv_usec = 0; } FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep); curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); switch(rc) { case -1: break; case 0: default: curl_multi_perform(multi_handle, &still_running); break; } } curl_multi_remove_handle(multi_handle, easy_handle); curl_easy_cleanup(easy_handle); curl_multi_cleanup(multi_handle); return 0; } ``` 在上述代码,首先初始化了一个curl_easy_handle对象,并设置了请求的URL和是否跟随重定向。然后,使用curl_multi_add_handle()函数将curl_easy_handle添加到curl_multi句柄,并调用curl_multi_perform()函数来发起异步请求。 之后,进入while循环,使用select()函数来监听文件描述符的变化。当文件描述符有变化时,调用curl_multi_perform()函数来处理请求。当所有请求都完成时,退出循环。 最后,使用curl_multi_remove_handle()函数从curl_multi句柄移除curl_easy_handle,并分别调用curl_easy_cleanup()和curl_multi_cleanup()函数来释放资源。 相关问题: 1. libcurl库是什么? 2. 如何使用libcurl库发送同步请求? 3. 如何设置请求头和请求体? 4. 如何处理响应数据?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值