我正在使用cURL multi从某些网站获取数据。使用代码:
function getURL($ids)
{
global $mh;
$curl = array();
$response = array();
$n = count($ids);
for($i = 0; $i < $n; $i++) {
$id = $ids[$i];
$url = 'http://www.domain.com/?id='.$id;
// Init cURL
$curl[$i] = curl_init($url);
curl_setopt($curl[$i], CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl[$i], CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl[$i], CURLOPT_USERAGENT, 'Googlebot/2.1 (http://www.googlebot.com/bot.html)');
//curl_setopt($curl[$i], CURLOPT_FORBID_REUSE, true);
//curl_setopt($curl[$i], CURLOPT_HEADER, false);
curl_setopt($curl[$i], CURLOPT_HTTPHEADER, array(
'Connection: Keep-Alive',
'Keep-Alive: 300'
));
// Set to multi cURL
curl_multi_add_handle($mh, $curl[$i]);
}
// Execute
do {
curl_multi_exec($mh, $flag);
} while ($flag > 0);
// Get response
for($i = 1; $i < $n; $i++) {
// Get data
$id = $ids[$i];
$response[] = array(
'id' => $id,
'data' => curl_multi_getcontent($curl[$i])
);
// Remove handle
//curl_multi_remove_handle($mh, $curl[$i]);
}
// Reponse
return $response;
}
但是,我有问题是cURL打开太多套接字连接到webserver。每个连接,cURL都会为webserver创建新的套接字。 我想当前的连接是保持活着的下一个连接。我不想要100个URL然后cURL必须创建100个套接字来处理:(
请帮帮我。非常感谢!
答案 0 :(得分:1)
所以不要打开那么多套接字。将代码修改为仅打开X套接字,然后重复使用这些套接字,直到消耗掉所有$ids
为止。或者将更少的$ ID传递给函数开始。
答案 1 :(得分:0)
我知道,这是旧的,但尚未给出正确答案,恕我直言。
请查看 CURLMOPT_MAX_TOTAL_CONNECTIONS 选项,它应该可以解决您的问题:
https://curl.se/libcurl/c/CURLMOPT_MAX_TOTAL_CONNECTIONS.html
还要确保不会意外禁用通过 HTTP/2 的多路复用:
https://curl.se/libcurl/c/CURLMOPT_PIPELINING.html
cURL 不再支持经典的 HTTP/1 流水线,但是一旦当前请求在该连接上完成,cURL 仍然可以重新使用现有的 HTTP/1 连接来发送新请求。