function Curl_http($array,$timeout='15'){
$res = array(); $mh = curl_multi_init();//创建多个curl语柄
foreach($array as $k=>$url){
$conn[$k]=curl_init($url);//初始化 curl_setopt($conn[$k], CURLOPT_TIMEOUT, $timeout);//设置超时时间
curl_setopt($conn[$k], CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($conn[$k], CURLOPT_MAXREDIRS, 7);//HTTp定向级别 ,7最高
curl_setopt($conn[$k], CURLOPT_HEADER, false);//这里不要header,加块效率
curl_setopt($conn[$k], CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
curl_setopt($conn[$k], CURLOPT_RETURNTRANSFER,1);//要求结果为字符串且输出到屏幕上
curl_setopt($conn[$k], CURLOPT_HTTPGET, true); curl_multi_add_handle ($mh,$conn[$k]);
}
//防止死循环耗死cpu 这段是根据网上的写法
do {
$mrc = curl_multi_exec($mh,$active);//当无数据,active=true
} while ($mrc == CURLM_CALL_MULTI_PERFORM);//当正在接受数据时
while ($active and $mrc == CURLM_OK) {//当无数据时或请求暂停时,active=true
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
} foreach ($array as $k => $url) {
if(!curl_errno($conn[$k])){
$data[$k]=curl_multi_getcontent($conn[$k]);//数据转换为array
$header[$k]=curl_getinfo($conn[$k]);//返回http头信息
curl_close($conn[$k]);//关闭语柄
curl_multi_remove_handle($mh , $conn[$k]); //释放资源
}else{
unset($k,$url);
}
} curl_multi_close($mh); return $data; }问题1:参考网上的一段代码,防止假死那段,存在根本跑不起来。直接死掉。使用下面的原始代码反而能够运行,请问是什么原因?
do { $n=curl_multi_exec($mh,$active); } while ($active);问题2:调用多线程方法,下载保存文件该如何操作?fopen,fclose写在哪个部分?怎么体现出多线程操作?问题3:如果有更好的代码,感谢分享测试数据如下:
$array = array(
"http://noavatar.csdn.net/3/D/6/1_chuganghong.jpg",
"http://avatar.csdn.net/2/5/9/1_u013474436.jpg"
);
$res = array(); $mh = curl_multi_init();//创建多个curl语柄
foreach($array as $k=>$url){
$conn[$k]=curl_init($url);//初始化 curl_setopt($conn[$k], CURLOPT_TIMEOUT, $timeout);//设置超时时间
curl_setopt($conn[$k], CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($conn[$k], CURLOPT_MAXREDIRS, 7);//HTTp定向级别 ,7最高
curl_setopt($conn[$k], CURLOPT_HEADER, false);//这里不要header,加块效率
curl_setopt($conn[$k], CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
curl_setopt($conn[$k], CURLOPT_RETURNTRANSFER,1);//要求结果为字符串且输出到屏幕上
curl_setopt($conn[$k], CURLOPT_HTTPGET, true); curl_multi_add_handle ($mh,$conn[$k]);
}
//防止死循环耗死cpu 这段是根据网上的写法
do {
$mrc = curl_multi_exec($mh,$active);//当无数据,active=true
} while ($mrc == CURLM_CALL_MULTI_PERFORM);//当正在接受数据时
while ($active and $mrc == CURLM_OK) {//当无数据时或请求暂停时,active=true
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
} foreach ($array as $k => $url) {
if(!curl_errno($conn[$k])){
$data[$k]=curl_multi_getcontent($conn[$k]);//数据转换为array
$header[$k]=curl_getinfo($conn[$k]);//返回http头信息
curl_close($conn[$k]);//关闭语柄
curl_multi_remove_handle($mh , $conn[$k]); //释放资源
}else{
unset($k,$url);
}
} curl_multi_close($mh); return $data; }问题1:参考网上的一段代码,防止假死那段,存在根本跑不起来。直接死掉。使用下面的原始代码反而能够运行,请问是什么原因?
do { $n=curl_multi_exec($mh,$active); } while ($active);问题2:调用多线程方法,下载保存文件该如何操作?fopen,fclose写在哪个部分?怎么体现出多线程操作?问题3:如果有更好的代码,感谢分享测试数据如下:
$array = array(
"http://noavatar.csdn.net/3/D/6/1_chuganghong.jpg",
"http://avatar.csdn.net/2/5/9/1_u013474436.jpg"
);
https://stackoverflow.com/questions/19490837/curlm-call-multi-perform-deprecated试试<?php
// create both cURL resources
$ch1 = curl_init();
$ch2 = curl_init();// set URL and other appropriate options
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);//create the multiple cURL handle
$mh = curl_multi_init();//add the two handles
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);$active = null;
//execute the handles
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}//close the handles
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);?>