Curl批量打开网址的PHP类,curl_multi_init

来源:互联网 发布:java写接口自动化测试 编辑:程序博客网 时间:2024/05/21 09:35
<?php/* * curl_multi 经本人测试,大于四个网址的时候要比Foreach循环快.. * by wc1217 */class curl_multi{    //Curl句柄    //private $curl_handle = null;    //网址    private $url_list = array();    //参数    private $curl_setopt = array(        'CURLOPT_RETURNTRANSFER' => 1, //结果返回给变量        'CURLOPT_HEADER' => 0, //要HTTP头不?        'CURLOPT_NOBODY' => 0, //不要内容?        'CURLOPT_FOLLOWLOCATION' => 0, //自动跟踪        'CURLOPT_TIMEOUT' => 6//超时(s)    );    function __construct($seconds = 30){        set_time_limit($seconds);    }    /*     * 设置网址     * @list 数组     */    public function setUrlList($list = array()){        $this->url_list = $list;    }    /*     * 设置参数     * @cutPot array     */    public function setOpt($cutPot){        $this->curl_setopt = $cutPot + $this->curl_setopt;    }    /*     * 执行     * @return array     */    public function exec(){        $mh = curl_multi_init();        foreach($this->url_list as $i => $url){            $conn[$i] = curl_init($url);            foreach($this->curl_setopt as $key => $val){                curl_setopt($conn[$i], preg_replace('/(CURLOPT_\w{1,})/ie', '$0', $key), $val);            }            curl_multi_add_handle($mh, $conn[$i]);        }        $active = false;        do{            $mrc = curl_multi_exec($mh, $active);        }while($mrc == CURLM_CALL_MULTI_PERFORM);        while($active and $mrc == CURLM_OK){            if(curl_multi_select($mh) != -1){                do{                    $mrc = curl_multi_exec($mh, $active);                }while($mrc == CURLM_CALL_MULTI_PERFORM);            }        }        $res = array();        foreach($this->url_list as $i => $url){            $res[$i] = curl_multi_getcontent($conn[$i]);            curl_close($conn[$i]);            curl_multi_remove_handle($mh, $conn[$i]);   //用完马上释放资源          }        curl_multi_close($mh);        return $res;    }}?>