我在一个循环中有多个curl请求。如何获得响应?
for($i = 1; $i <= 10; $i++) {
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,"http://www.example.com");
if(curl_exec($ch)===false){
break;
}
}
答案 0 :(得分:1)
让我们以一个示例为例,假设服务器将在单个请求中返回单个 id 的数据,则需要基于id从服务器获取记录。
现在,如果我们使用cURL,则需要为每个 id 迭代循环并请求服务器,因此,如果有 10 个ID,则平均响应时间将为< 单个请求的strong> 10X 。
$result=array();
foreach ($ids as $id) {
// URL from which data will be fetched
$fetchURL = 'https://webkul.com&customerId='.$id;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $fetchURL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result[] = curl_exec($ch);
curl_close($ch);
}
但是,如果使用多个 cURL请求,则响应时间将大大减少。为此,您需要首先初始化curl_multi_init()
,使用for()
将所有请求推送到数组,最后将请求发送到curl_multi_exec()
// array of curl handles
$multiCurl = array();
// data to be returned
$result = array();
// multi handle
$mh = curl_multi_init();
foreach ($ids as $i => $id) {
// URL from which data will be fetched
$fetchURL = 'https://webkul.com&customerId='.$id;
$multiCurl[$i] = curl_init();
curl_setopt($multiCurl[$i], CURLOPT_URL,$fetchURL);
curl_setopt($multiCurl[$i], CURLOPT_HEADER,0);
curl_setopt($multiCurl[$i], CURLOPT_RETURNTRANSFER,1);
curl_multi_add_handle($mh, $multiCurl[$i]);
}
$index=null;
do {
curl_multi_exec($mh,$index);
} while($index > 0);
// get content and remove handles
foreach($multiCurl as $k => $ch) {
$result[$k] = curl_multi_getcontent($ch);
curl_multi_remove_handle($mh, $ch);
}
// close
curl_multi_close($mh);
完整参考: https://webkul.com/blog/simultaneous-curl-requests-in-php/