[转]curl_multi 实现准多进程发请求

FROM : http://blog.sina.com.cn/s/blog_515b90d00100jtnv.html

curl_multi函数族:
curl_multi_close
curl_multi_exec
curl_multi_getcontent
curl_multi_add_handle
curl_multi_info_read
curl_multi_init
curl_multi_remove_handle
curl_multi_select

用法步骤:
第一步:调用curl_multi_init
第二步:循环调用curl_multi_add_handle
这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle。
第三步:持续调用curl_multi_exec
第四步:根据需要循环调用curl_multi_getcontent获取结果
第五步:调用curl_multi_remove_handle,并为每个字handle调用curl_close
第六步:调用curl_multi_close

下面看我在一个小项目中的使用:

  public function Request($requestdata,$kw)
    { 
        $mh = curl_multi_init();
        $running=null;
        $user_agent ="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)";
        foreach($requestdata as &$data)
        {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $data['url']);  
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
            curl_setopt($ch, CURLOPT_TIMEOUT , 100000);  
            curl_multi_add_handle($mh,$ch);
            $data['ch']=$ch;
            $data['start']=microtime(1);
        }unset($data);
        do{
            while(($execrun = curl_multi_exec($mh, $running)) == CURLM_CALL_MULTI_PERFORM);
            while($done = curl_multi_info_read($mh)) {
                foreach($requestdata as $data)
                {
                    if ($data['ch'] === $done['handle']) {
                        $html = curl_multi_getcontent($done['handle']);
                        call_user_func($data['callback'], $data['url'], $html,round((microtime(1)-$data['start']),2),$kw);
                        curl_multi_remove_handle($mh, $done['handle']);
                    }
                }
            }
            if (!$running) break;
            while (($res = curl_multi_select($mh)) === 0);
            if ($res === false) break;
        }while(true);
        curl_multi_close($mh);
    }

 

posted @ 2015-08-17 18:00  Athrun  阅读(1986)  评论(0编辑  收藏  举报