PHP

php curl并发请求

2019-10-11  本文已影响0人  7c3b293d3b97
<?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);
上一篇下一篇

猜你喜欢

热点阅读