自己整理下,有時(shí)間在研究
class Learncurlmulti_IndexController extends ControllerBase_LCMbase{
private $hosts=array(
'http://my.com/LearnCurlMulti_add',
'http://my.com/LearnCurlMulti_edit',
'http://my.com/LearnCurlMulti_detail',
'http://my.com/LearnCurlMulti_list',
);
/**
* curl單線程請(qǐng)求
* @final 20S
*/
public function indexAction(){
p(date('H:i:s',time()));
$data=array();
foreach ($this->hosts as $v){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$v);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOSIGNAL,true);
$data[]=curl_exec($ch);
}
p(date('H:i:s',time()));
p($data);
}
/**
* 傳統(tǒng)多線程
* @final 5S
* 缺點(diǎn)铅搓,總要等最后一個(gè)完成才算全完成舞竿,先完成的還在占用資源
*/
public function multiAction(){
p(date('H:i:s',time()));
$queue =curl_multi_init();
$map=array();
foreach($this->hosts as $k=>$url){
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_TIMEOUT,30);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_NOSIGNAL,true);
curl_setopt($ch,CURLOPT_NOSIGNAL,1);
curl_multi_add_handle($queue,$ch);
$map[$url]=$ch;
}
do{
$mrc=curl_multi_exec($queue,$active);
}while($mrc==CURLM_CALL_MULTI_PERFORM);
while($active && $mrc==CURLM_OK){
//這塊是防止select返回1導(dǎo)致死循環(huán),判斷select前先exec下
while(curl_multi_exec($queue,$active)===CURLM_CALL_MULTI_PERFORM){
$mrc=curl_multi_exec($queue,$active);
}
if(curl_multi_select($queue,0.5)!=-1){
do{
$mrc=curl_multi_exec($queue,$active);
}while($mrc==CURLM_CALL_MULTI_PERFORM);
}
}
$responses=array();
foreach($map as $url=>$c){
$responses[$url]=curl_multi_getcontent($c);
curl_multi_remove_handle($queue,$c);
curl_close($c);
}
curl_multi_close($queue);
p($responses);
p(date('H:i:s',time()));
die;
}
/**
* 改進(jìn)版多線程
*/
public function rollingmultiAction(){
$queue=curl_multi_init();
$map=array();
foreach($this->hosts as $url){
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_TIMEOUT,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_NOSIGNAL,true);
curl_multi_add_handle($queue,$ch);
$map[(string)$ch]=$url;
}
$responses=array();
do{
while(($code=curl_multi_exec($queue,$active))==CURLM_CALL_MULTI_PERFORM);
if($code!=CURLM_OK){break;}
while($done=curl_multi_info_read($queue)){
$info=curl_getinfo($done['handle']);
$error=curl_error($done['handle']);
$results=curl_multi_getcontent($done['handle']);
$responses[$map[(string)$done['handle']]]=compact('info','error','results');
curl_multi_remove_handle($queue,$done['handle']);
curl_close($done['handle']);
}
if($active>0){
curl_multi_select($queue,0.5);
}
}while($active);
curl_multi_close($queue);
p($responses);
die;
}
}