[转]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); }
申明
非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!
博文欢迎转载,但请给出原文连接。