0

cURL multi を使用して、いくつかの Web サイトからデータを取得しています。コード付き:

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 が開いているソケットが多すぎて Web サーバーに接続できないことです。各接続、cURL は Web サーバーへの新しいソケットを作成します。現在の接続を次の接続のためにキープアライブにしたい。100個のURLが必要ない場合、cURLは処理するために100個のソケットを作成する必要があります:(

私を助けてください。本当にありがとう !

4

2 に答える 2

1

したがって、それほど多くのソケットを開かないでください。X ソケットのみを開くようにコードを変更し、すべてのソケット$idsが消費されるまでそれらのソケットを繰り返し使用します。それか、最初に関数に渡す $id の数を減らしてください。

于 2011-08-10T15:34:41.463 に答える