美文网首页PHP
php curl并发请求

php curl并发请求

作者: 7c3b293d3b97 | 来源:发表于2019-10-11 16:46 被阅读0次
    <?php
    class A
    {
    //PHP curl 参考http://www.php.net/manual/zh/ref.curl.php
        /*
         * curl_multi_init();//初始化
         * curl_setopt();//设置传输项
         * curl_multi_add_handle();//添加句柄
         * curl_multi_exec();//执行句柄
         * curl_multi_getcontent();//获取数据
         * curl_multi_remove_handle();//移除句柄
         * curl_multi_close();//关闭句柄
         *
         * */
        public function curls($url, $param)//并发请求
        {
            $mh = curl_multi_init();
            foreach ($url as $k => $v) {
                $handles[$k] = curl_init($v);
                //传输项设置curl_setopt  参考http://php.net/manual/zh/function.curl-setopt.php
                curl_setopt($handles[$k], CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($handles[$k], CURLOPT_POST, 1);
                curl_setopt($handles[$k],CURLOPT_HTTPHEADER,[]);
                curl_setopt($handles[$k], CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
                curl_setopt($handles[$k], CURLOPT_POSTFIELDS, http_build_query($param));
    curl_setopt($handles[$k], CURLOPT_ENCODING, 'gzip');
    curl_setopt($handles[$k], CURLOPT_SSL_VERIFYPEER, false);
                curl_multi_add_handle($mh, $handles[$k]);
            }
            $active = null;
            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);
                }
            }*/
            while ($active && $mrc == CURLM_OK) {
                while (curl_multi_exec($mh, $active) === CURLM_CALL_MULTI_PERFORM) ;
                if (curl_multi_select($mh) != -1) {
                    do {
                        $mrc = curl_multi_exec($mh, $active);
                        if ($mrc == CURLM_OK) {
                            while ($info = curl_multi_info_read($mh)) {
                                //$mac = $info;
                            }
                        }
                    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
                }
            }
            $contents = array('status' => true, 'content' => array(), 'error_msg' => array());
            foreach ($handles as $i => $ch) {
                $content = curl_multi_getcontent($ch);
                if (curl_errno($ch) == 0) {   //返回错误代码或在没有错误发生时返回 0 (零)。
                    var_dump($content);
    
                } else {  //存在错误,不再继续请求其他接口
                    $contents['error_msg'] = array(
                        'url' => $url[$i],
                        'msg' => curl_error($ch)//获取错误代码
                    );
                    curl_multi_close($mh);//关闭所有句柄
                    return $contents;
                }
                foreach ($handles as $ch)    //移除批处理句柄
                    curl_multi_remove_handle($mh, $ch);
                curl_multi_close($mh);  //关闭批处理句柄
                return $contents;
            }
        }
        /*
         *curl_init();//初始化
         *curl_setopt();//设置传输项
         *curl_exec();//执行句柄 获取数据
         * curl_close();//关闭句柄
         *
         * */
        public function curl($url,  $postfields = '', $method = 'POST', $headers = array()){
            $ci = curl_init();
            curl_setopt($ci,CURLOPT_RETURNTRANSFER,1);
            curl_setopt($ci,CURLOPT_CONNECTTIMEOUT,30);
            curl_setopt($ci,CURLOPT_TIMEOUT,30);
            if ($method == 'POST') {
                curl_setopt($ci,CURLOPT_POST,TRUE);
                if ($postfields != '')
                    curl_setopt($ci,CURLOPT_POSTFIELDS,$postfields);
            }
            $headers[] = "User-Agent: *";
            curl_setopt($ci,CURLOPT_HTTPHEADER,$headers);
            curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ci,CURLOPT_URL,$url);
            $result = curl_exec($ci);
            $errno = curl_errno($ci);
            curl_close($ci);
            if ($errno == 0) {
                return $result;
            } else{
                return ['errCode'=>-200,'errMsg'=>'失败','data'=>[]];
            }
        }
    }
    $urls = ['https://www.baidu.com'];
    $param = ['token'=>'3695f501b9272191eec36955783dfd4d3c3f5783dfd4d3c3f191eec369556955783dfdf501b9272191eec36955783dfd'];
    $a = new A();
    $r = $a->curls($urls, $param);
    print_r($r);
    echo "<br>***************************************************************<br>";
    $url = 'https://www.baidu.com';
    $r = $a->curl($url, $param);
    print_r($r);
    

    相关文章

      网友评论

        本文标题:php curl并发请求

        本文链接:https://www.haomeiwen.com/subject/kvhxmctx.html