$mrc = curl_multi_init();
//发出请求
.......
$active = null;
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);
}
}
//下面是处理请求返回的结果
但如果我有1000个请求,那么curl批处理将并发1000个请求,显然是不合理,所以应该要控制一个并发数,并且将剩余的连接添加到请求队列里:
参考:How to use curl_multi() without blocking
复制代码 代码如下:
<?php
$connomains = array(
//2.php自己去些
"http://localhost/2.php?id=1",//sleep(1)秒
"http://localhost/2.php?id=2",//sleep(2)秒
"http://localhost/2.php?id=5",//sleep(5)秒
);
$mh = curl_multi_init();
foreach ($connomains as $i => $url) {
$conn[$i] = curl_init($url);//初始化各个子连接
curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER, 1);//不直接输出到浏览器
curl_multi_add_handle ($mh,$conn[$i]);//加入多处理句柄
}
$active = 0;//连接数
do {
do{
//这里$active会被改写成当前未处理数
//全部处理成功$active会变成0
$mrc = curl_multi_exec($mh, $active);
//这个循环的目的是尽可能的读写,直到无法继续读写为止(返回CURLM_OK)
//返回(CURLM_CALL_MULTI_PERFORM)就表示还能继续向网络读写
}while($mrc==CURLM_CALL_MULTI_PERFORM);
//如果一切正常,那么我们要做一个轮询,每隔一定时间(默认是1秒)重新请求一次
//这就是curl_multi_select的作用,它在等待过程中,如果有就返回目前可以读写的句柄数量,以便
//继续读写操作,0则没有可以读写的句柄(完成了)
} while ($mrc==CURLM_OK&& $active &&curl_multi_select($mh)!=-1);//直到出错或者全部读写完毕
if ($mrc != CURLM_OK) {
print "Curl multi read error $mrc/n";
}
// retrieve data
foreach ($connomains as $i => $url) {
if (($err = curl_error($conn[$i])) == '') {
$res[$i]=curl_multi_getcontent($conn[$i]);
} else {
print "Curl error on handle $i: $err/n";
}
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
}
curl_multi_close($mh);
print_r($res);
?>
有的人为了省事,这样写:
do { curl_multi_exec($mh,$active); } while ($active);