Слишком много розеток, открытых cURL multi - PullRequest
0 голосов
/ 10 августа 2011

Я использую 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 создает новый сокет для веб-сервера.Я хочу, чтобы текущее соединение поддерживалось для следующего соединения.Я не хочу, чтобы этот URL-адрес 100, тогда cURL должен создать 100 сокетов для обработки: (

Пожалуйста, помогите мне.

1 Ответ

1 голос
/ 10 августа 2011

Так что не открывайте столько сокетов.Измените свой код, чтобы открывать только сокеты X, а затем повторно используйте эти сокеты, пока все ваши $ids не будут использованы.Для начала или передайте в функцию меньше $ id.

...