| 
<?php
/*
 * curl_multi 经测试,大于四个网址时要比Foreach循环快..
 * by wc1217
 * edit:bbs.it-home.org
 */
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;
    }
}
?> 复制代码 |