curl 多線程請求 (可使用代理IP)
/**
* curl 多線程
* @param array $urlArray 並行網址
* @param str $method 請求方式(get,post)
* @param str $header 請求頭
* @param str $proxy 代理IP
* @return array
*/
function http_request_multi($urlArray,$method='',$header='',$proxy='')
{
unset($mh);
unset($curl);
$mh = curl_multi_init();
for($i=count($urlArray);$i>=0;$i--)
{
$curl[$i] = curl_init();
$random_ip= random_ip();
curl_setopt($curl[$i], CURLOPT_URL, $urlArray[$i]);
curl_setopt($curl[$i], CURLOPT_HEADER, 0);
curl_setopt($curl[$i], CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl[$i], CURLOPT_TIMEOUT, 30);
curl_setopt($curl[$i], CURLOPT_HTTPHEADER, array("X-FORWARDED-FOR:{$random_ip}","CLIENT-IP:{$random_ip}")); //構造IP
curl_setopt($curl[$i], CURLOPT_USERAGENT, 'iTunes/12.3.3 (Windows; Microsoft Windows 7 x64 Ultimate Edition Service Pack 1 (Build 7601); x64) ');
curl_setopt($curl[$i], CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl[$i], CURLOPT_SSL_VERIFYHOST, false);
if($proxy){
curl_setopt($curl[$i], CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_setopt($curl[$i], CURLOPT_PROXY, $proxy);
}
if($method){
curl_setopt($curl[$i], CURLOPT_POST, 1);
curl_setopt($curl[$i], CURLOPT_POSTFIELDS, $method[$i]);
}
if($header){
curl_setopt($curl[$i], CURLOPT_HTTPHEADER, $header);
}
curl_multi_add_handle($mh,$curl[$i]);
}
$action = null;
do{
$mrc = curl_multi_exec($mh,$action);
}while ($mrc == CURLM_CALL_MULTI_PERFORM);
unset($num);
$num = 0;
while($action && $mrc == CURLM_OK) {
if(curl_multi_select($mh) == 0)
{
$num++; //如果有一個0 那麼num 就加1
}
if($num == 30) //假如已經有30個0等待不到活動鏈接了 那就退出本次循環吧。
{
break;
}
if(curl_multi_select($mh) == -1){
usleep(100);
}
do{
$mrc = curl_multi_exec($mh,$action);
}while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
unset($newcomment);
$newcomment = array();
for($i=count($urlArray);$i>=0;$i--)
{
$newcomment[] = curl_multi_getcontent($curl[$i]);
curl_multi_remove_handle($mh, $curl[$i]);
curl_close($curl[$i]);
}
curl_multi_close($mh);
if($newcomment){
array_shift($newcomment);
$newcomment = array_reverse($newcomment);
return $newcomment;
}else{
return false;
}
}
// 構造IP
function random_ip(){
return rand(1,254).'.'.rand(1,254).'.'.rand(1,254).'.'.rand(1,254);
}
//測試
$array = array(
"http://www.baidu.com/",
"http://www.renren.com/",
"http://www.qq.com/"
);
$data = http_request_multi($array);//調用
print_r($data);//輸出
?>
* curl 多線程
* @param array $urlArray 並行網址
* @param str $method 請求方式(get,post)
* @param str $header 請求頭
* @param str $proxy 代理IP
* @return array
*/
function http_request_multi($urlArray,$method='',$header='',$proxy='')
{
unset($mh);
unset($curl);
$mh = curl_multi_init();
for($i=count($urlArray);$i>=0;$i--)
{
$curl[$i] = curl_init();
$random_ip= random_ip();
curl_setopt($curl[$i], CURLOPT_URL, $urlArray[$i]);
curl_setopt($curl[$i], CURLOPT_HEADER, 0);
curl_setopt($curl[$i], CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl[$i], CURLOPT_TIMEOUT, 30);
curl_setopt($curl[$i], CURLOPT_HTTPHEADER, array("X-FORWARDED-FOR:{$random_ip}","CLIENT-IP:{$random_ip}")); //構造IP
curl_setopt($curl[$i], CURLOPT_USERAGENT, 'iTunes/12.3.3 (Windows; Microsoft Windows 7 x64 Ultimate Edition Service Pack 1 (Build 7601); x64) ');
curl_setopt($curl[$i], CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl[$i], CURLOPT_SSL_VERIFYHOST, false);
if($proxy){
curl_setopt($curl[$i], CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_setopt($curl[$i], CURLOPT_PROXY, $proxy);
}
if($method){
curl_setopt($curl[$i], CURLOPT_POST, 1);
curl_setopt($curl[$i], CURLOPT_POSTFIELDS, $method[$i]);
}
if($header){
curl_setopt($curl[$i], CURLOPT_HTTPHEADER, $header);
}
curl_multi_add_handle($mh,$curl[$i]);
}
$action = null;
do{
$mrc = curl_multi_exec($mh,$action);
}while ($mrc == CURLM_CALL_MULTI_PERFORM);
unset($num);
$num = 0;
while($action && $mrc == CURLM_OK) {
if(curl_multi_select($mh) == 0)
{
$num++; //如果有一個0 那麼num 就加1
}
if($num == 30) //假如已經有30個0等待不到活動鏈接了 那就退出本次循環吧。
{
break;
}
if(curl_multi_select($mh) == -1){
usleep(100);
}
do{
$mrc = curl_multi_exec($mh,$action);
}while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
unset($newcomment);
$newcomment = array();
for($i=count($urlArray);$i>=0;$i--)
{
$newcomment[] = curl_multi_getcontent($curl[$i]);
curl_multi_remove_handle($mh, $curl[$i]);
curl_close($curl[$i]);
}
curl_multi_close($mh);
if($newcomment){
array_shift($newcomment);
$newcomment = array_reverse($newcomment);
return $newcomment;
}else{
return false;
}
}
// 構造IP
function random_ip(){
return rand(1,254).'.'.rand(1,254).'.'.rand(1,254).'.'.rand(1,254);
}
//測試
$array = array(
"http://www.baidu.com/",
"http://www.renren.com/",
"http://www.qq.com/"
);
$data = http_request_multi($array);//調用
print_r($data);//輸出
?>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.