curl 多線程請求 (可使用代理IP)

    /** 
     * curl 多線程 
     * @param array $urlArray    並行網址 
     * @param str      $method    請求方式(get,post)
     * @param str      $header     請求頭
     * @param str      $proxy        代理IP
     * @return array 
     */ 
    function http_request_multi($urlArray,$method='',$header='',$proxy='')
    {
        unset($mh);
        unset($curl);
        $mh = curl_multi_init();

        for($i=count($urlArray);$i>=0;$i--)
        {
            $curl[$i] = curl_init();
            $random_ip= random_ip();
            curl_setopt($curl[$i], CURLOPT_URL, $urlArray[$i]);
            curl_setopt($curl[$i], CURLOPT_HEADER, 0);
            curl_setopt($curl[$i], CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl[$i], CURLOPT_TIMEOUT, 30);
            curl_setopt($curl[$i], CURLOPT_HTTPHEADER, array("X-FORWARDED-FOR:{$random_ip}","CLIENT-IP:{$random_ip}")); //構造IP
            curl_setopt($curl[$i], CURLOPT_USERAGENT, 'iTunes/12.3.3 (Windows; Microsoft Windows 7 x64 Ultimate Edition Service Pack 1 (Build 7601); x64) ');
            curl_setopt($curl[$i], CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($curl[$i], CURLOPT_SSL_VERIFYHOST, false);

            if($proxy){
                curl_setopt($curl[$i], CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
                curl_setopt($curl[$i], CURLOPT_PROXY, $proxy);
            }

            if($method){
                curl_setopt($curl[$i], CURLOPT_POST, 1);
                curl_setopt($curl[$i], CURLOPT_POSTFIELDS, $method[$i]);
            }

            if($header){
                curl_setopt($curl[$i], CURLOPT_HTTPHEADER, $header);
            }
            curl_multi_add_handle($mh,$curl[$i]);
        }

        $action = null;

        do{
            $mrc = curl_multi_exec($mh,$action);
        }while ($mrc == CURLM_CALL_MULTI_PERFORM);

        unset($num);
        $num = 0;
        while($action && $mrc == CURLM_OK) {

            if(curl_multi_select($mh) == 0)
            {
                $num++;                                 //如果有一個0 那麼num 就加1
            }

            if($num == 30)                              //假如已經有30個0等待不到活動鏈接了 那就退出本次循環吧。
            {
                break;
            }

            if(curl_multi_select($mh) == -1){
                usleep(100);
            }

            do{
                $mrc = curl_multi_exec($mh,$action);
            }while ($mrc == CURLM_CALL_MULTI_PERFORM);

        }

        unset($newcomment);
        $newcomment = array();

        for($i=count($urlArray);$i>=0;$i--)
        {
            $newcomment[] = curl_multi_getcontent($curl[$i]);
            curl_multi_remove_handle($mh, $curl[$i]);
            curl_close($curl[$i]);
        }

        curl_multi_close($mh);

        if($newcomment){
            array_shift($newcomment);
            $newcomment = array_reverse($newcomment);
            return $newcomment;
        }else{
            return false;
        }

    }

    // 構造IP
    function random_ip(){
        return rand(1,254).'.'.rand(1,254).'.'.rand(1,254).'.'.rand(1,254);
    }

    //測試
    $array = array(
        "http://www.baidu.com/",
        "http://www.renren.com/",
        "http://www.qq.com/"
    );
    
    $data = http_request_multi($array);//調用
    print_r($data);//輸出


 ?>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章