curl_multi_add_handle максимальное значение URL

Discussion in 'PHP' started by .::BARS::., 13 Jul 2012.

  1. .::BARS::.

    .::BARS::. Elder - Старейшина

    Joined:
    13 Oct 2007
    Messages:
    379
    Likes Received:
    45
    Reputations:
    10
    Всем привет.. нужно пропарсить 1млн страниц... решил парсить с помошью курл по 100 потоков

    задаю в массив сразу все 1млн юрлов и лезет ошибка

    погуглив по ошибке ничего не нашел... понял что если задавать курлу не 1млн юрлов а к примеру 10к, то все работает прекрасно.

    возможно это ограничение на количество элементов в массиве?

    как предложите обойти такой косяк?

    юрлы добавляются в массив банально

    PHP:
    for($i=3000000;$i<=4000000;$i++){
        
    $urls[$i]='http://site.ru/'.$i;
    } 
    строки с 16 по 31

    PHP:
    foreach ($urls as $url) {
        
    $ch = curl_init($url);
        
    //echo $url.'<br>';
        
    curl_setopt($ch, CURLOPT_URL,$url);
        
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
        
    curl_setopt($ch, CURLOPT_REFERER, 'http://site.ru/');
        
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)");
        
    curl_setopt($ch, CURLOPT_COOKIEFILE, './cookie'); 
        
    curl_setopt($ch, CURLOPT_COOKIEJAR,  './cookie'); 
        
    curl_setopt($ch, CURLOPT_HEADER, 0);
        
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1);
        
    curl_setopt($ch, CURLOPT_TIMEOUT, 1);
        
    $tasks[$url] = $ch;
        
    curl_multi_add_handle($cmh, $ch);
    }
     
  2. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    Вот этот код (твой), который парсит мультикурлом, заверни в функцию. Которая будет принимать как один из аргументов - массив ссылок ($urls), а возвращать массив результатов (я незнаю, что тебе нужно, если целые страницы, то массив целых страниц, если только какой-то конкретно другой контент, то его).

    Назовем эту функцию, например, funkciya_parsinga(). Теперь вызывай ее вот так:


    PHP:
    function funkciya_parsinga($urls)
    {
    ...
    return 
    $results;
    }

    $i = 0;
    $potokov_za_raz = 10000;
    $rezultaty = array();

    for (
    $i = 0; $i < ceil(count($urls) / $potokov_za_raz); $i++)
    {
        
    $rezultaty = array_merge($rezultaty, funkciya_parsinga(array_slice($urls, $i*$potokov_za_raz, $potokov_za_raz)));
    }
     
    #2 |qbz|, 13 Jul 2012
    Last edited: 13 Jul 2012
    1 person likes this.
  3. .::BARS::.

    .::BARS::. Elder - Старейшина

    Joined:
    13 Oct 2007
    Messages:
    379
    Likes Received:
    45
    Reputations:
    10
    |qbz|, разобрался уже, но все равно спасибо!