0

我正在使用 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 打开了太多套接字以连接到网络服务器。每个连接,cURL 都会为 web 服务器创建新的套接字。我希望当前连接保持活动状态以进行下一个连接。我不想要 100 个 URL,然后 cURL 必须创建 100 个套接字来处理:(

请帮我。非常感谢 !

4

2 回答 2

1

所以不要打开那么多套接字。修改您的代码以仅打开 X 个套接字,然后重复使用这些套接字,直到您的所有套接字$ids都被消耗完。或者将更少的 $ids 传递给函数开始。

于 2011-08-10T15:34:41.463 回答
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 连接来发送新请求。

于 2021-03-31T18:59:52.700 回答