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()."";
?>