Multi Curl не может обрабатывать более 200 запросов одновременно - PullRequest
3 голосов
/ 18 июня 2011

Подскажите, пожалуйста, есть ли ограничения на отправку запроса с использованием multi_curl. Когда я пытался отправить запрос более 200, он получал тайм-аут.

см. Код ниже .............. .........................................

foreach($newUrlArry as $url){   
            $gatherUrl[] = $url['url'];
        }
        /*...................Array slice----------------------*/

        $totalUrlRequest = count($gatherUrl);
        if($totalUrlRequest > 10){
            $offset = 10;
            $index = 0;
            $matchedAnchors = array();
            $dom = new DOMDocument;
            $NoOfTilesRequest = ceil($totalUrlRequest/$offset);
            for($sl = 0; $sl<$NoOfTilesRequest;$sl++){
                $output = array_slice($gatherUrl, $index, $offset);
                $index = $offset+$index;
                $responseAction = $this->multiRequestAction($output);
                $k=0;
                foreach($responseAction as $responseHtml){
                @$dom->loadHTML($responseHtml);
                $documentLinks = $dom->getElementsByTagName("a");
                $chieldFlag = false;
                for($i=0;$i<$documentLinks->length;$i++) {
                $documentLink = $documentLinks->item($i);
                   if ($documentLink->hasAttribute('href') AND substr($documentLink->getAttribute('href'), 0, strlen($match)) == $match) {
                            $description = $documentLink->childNodes;
                            foreach($description as $words) {
                                $name =  trim($words->nodeName);
                                if($name == 'em' ||  $name == 'b' || $name=="span" || $name=="p") {
                                    if(!empty($words->nodeValue)) {
                                        $matchedAnchors[$sl][$k]['anchor']  = trim($words->nodeValue);
                                        $matchedAnchors[$sl][$k]['img']         = 0;
                                        if($documentLink->hasAttribute('rel'))
                                            $matchedAnchors[$sl][$k]['rel']    = 'Y';
                                        else
                                            $matchedAnchors[$sl][$k]['rel']    = 'N';   
                                        $chieldFlag = true;
                                        break;
                                    }
                                }
                                elseif($name == 'img' ) { 
                                    $alt= $words->getAttribute('alt');
                                    if(!empty($alt)) {
                                        $matchedAnchors[$sl][$k]['anchor']  =  trim($words->getAttribute('alt'));
                                        $matchedAnchors[$sl][$k]['img']         = 1; 
                                        if($documentLink->hasAttribute('rel'))
                                            $matchedAnchors[$sl][$k]['rel']    = 'Y';
                                        else
                                            $matchedAnchors[$sl][$k]['rel']    = 'N';   
                                        $chieldFlag = true;
                                        break;
                                    }
                                }

                            }
                            if(!$chieldFlag){
                                $matchedAnchors[$sl][$k]['anchor']  = $documentLink->nodeValue;
                                $matchedAnchors[$sl][$k]['img']         = 0; 
                                if($documentLink->hasAttribute('rel'))
                                    $matchedAnchors[$sl][$k]['rel']    = 'Y';
                                else
                                    $matchedAnchors[$sl][$k]['rel']    = 'N';   
                            }

                        }

                    }$k++;
                }       
            }
        }

Ответы [ 2 ]

4 голосов
/ 12 июля 2011

В @Phliplip и @lunixbochs упоминаются общие ловушки cURL (максимальное время выполнения и отклонено целевым сервером).

При отправке такого количества запросов cURL на один и тот же сервер я стараюсь "быть хорошим" идобровольно спите, чтобы я не бомбардировал хозяина.Для сайта низкого уровня 1000+ запросов могут быть похожи на мини DDOS!

Вот код, который работал для меня.Раньше он собирал данные о клиентских продуктах со своего старого сайта, поскольку данные были заблокированы в собственной системе баз данных с функцией экспорта NO .

<?php
header('Content-type: text/html; charset=utf-8', true);
set_time_limit(0);
$urls = array(
    'http://www.example.com/cgi-bin/product?id=500', 
    'http://www.example.com/cgi-bin/product?id=501',  
    'http://www.example.com/cgi-bin/product?id=502',  
    'http://www.example.com/cgi-bin/product?id=503',  
    'http://www.example.com/cgi-bin/product?id=504', 
);
$i = 0;
foreach($urls as $url){
    echo $url."\n";
    $curl = curl_init($url);
    $userAgent = 'Googlebot/2.1 (http://www.googlebot.com/bot.html)';
    curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);
    curl_setopt($curl, CURLOPT_AUTOREFERER, true);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt($curl, CURLOPT_TIMEOUT, 25 );
    $html = curl_exec($curl);
    $html = @mb_convert_encoding($html, 'HTML-ENTITIES', 'utf-8');  
    curl_close($curl);
    // now do something with info returned by curl 
    $i++;
    if($i%10==0){
        sleep(20);
    } else {
        sleep(2);
    }
}
?>

Основные характеристики:

  • нет максимального времени выполнения
  • добровольный сон
  • новый init & exec curl для каждогоrequest.

По моему опыту, переход в спящий режим () не позволит серверам отказывать вам.Однако если под « другой сервер различен » вы имеете в виду, что вы отправляете небольшое количество запросов большому количеству серверов, например:

$urls = array(
    'http://www.example-one.com/', 
    'http://www.example-two.com/', 
    'http://www.example-three.com/', 
    'http://www.example-four.com/', 
    'http://www.example-five.com/', 
    'http://www.example-six.com/'
);

И вы используете set_time_limit(0);тогда что-то, тогда ошибка может быть причиной вашего кода die; попробовать

ini_set('display_errors',1); 
error_reporting(E_ALL);

и сообщить нам сообщение об ошибке, которое вы получаете.

1 голос
/ 18 июня 2011

PHP не накладывает ограничения на количество соединений, использующих curl_multi_init, но использование памяти и ограничения по времени будут проблемой.

Проверьте настройку memory_limit в php.ini и попробуйте увеличить ее, чтобы посмотреть, поможет ли это вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...