php curl_multi_initマルチスレッド

4866 ワード

phpはマルチスレッドがないとよく文句を言われますが、爬虫類を作るのは骨が折れるので、実はずっと誤解しています.curl_multi_Initは良いマルチスレッド送信方法です.domDocmentクラスに合わせて爬虫機能を完璧に実現できます.以下は例コードで、解析htmlは含まれていません.
startTime = microtime(true); //             $startTime
}
//                 
function stop(){
$this->stopTime = microtime(true); //            $stopTime
}
//                
function spent(){
//   4 5   4   
return round(($this->stopTime-$this->startTime),4);
}
}

$timer= new Timer(); 
$timer->start(); //                

ob_end_clean();
//$save_to='./test.txt';   //               
//$st = fopen($save_to,"a");   

$mh = curl_multi_init();   
foreach ($urls as $i => $url) {   
  $conn[$i] = curl_init($url);   
  curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");   
  curl_setopt($conn[$i], CURLOPT_HEADER ,0);   
  curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);   
  curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true);  //              ,           
  echo $i;
  curl_multi_add_handle ($mh,$conn[$i]);   
}   

do {   
  curl_multi_exec($mh,$active);   
} while ($active);   

foreach ($urls as $i => $url) {   
  $data = curl_multi_getcontent($conn[$i]); //              
  //fwrite($st,$data.$i);  //         。  ,        ,         
   file_put_contents("file/".$i.".txt",$data);
   echo $url."
"; ob_flush(); flush(); //usleep(200000); } // , foreach ($urls as $i => $url) { curl_multi_remove_handle($mh,$conn[$i]); curl_close($conn[$i]); } curl_multi_close($mh); //fclose($st); $timer->stop(); // echo "run time -> ".$timer->spent().""; ?>