цикл выполнения multi_сurl

Discussion in 'PHP' started by AnGeI, 22 Jun 2012.

  1. AnGeI

    AnGeI Elder - Старейшина

    Joined:
    8 Dec 2008
    Messages:
    396
    Likes Received:
    79
    Reputations:
    16
    Вопрос вроде-как обширный - решил создать тему.

    Есть Цикл1

    PHP:
    do {
          
    $mrc curl_multi_exec($mh$active);
    } while (
    $active>0); 
    Особых сложностей для понимания не вызывает, выполняется пока все потоки не выполнятся или таймаут не закончится.

    Цикл2

    PHP:
    $running=null;
    //просто запускаем все соединения
    while( ($mrc curl_multi_exec($mh$running))==CURLM_CALL_MULTI_PERFORM );
    while(
    $running && $mrc == CURLM_OK){
       if(
    $running and curl_multi_select($mh)!=-){
            do{
                
    $mrc curl_multi_exec($mh$running);
                
    // если поток завершился
                
    if( $info=curl_multi_info_read($mh) and $info['msg'] == CURLMSG_DONE ){
                    
    $ch $info['handle'];
                    
    // смотрим http код который он вернул
                    
    $status=curl_getinfo($ch,CURLINFO_HTTP_CODE);
                    
    // и собственно что он вернул
                    
    $data=curl_multi_getcontent($info['handle']);
                    
    curl_multi_remove_handle($mh$ch); // удаляем наше соединение из стека
                    
    curl_close($ch); // закрываем его
                
    }
            }while (
    $mrc == CURLM_CALL_MULTI_PERFORM);
        }
        
    usleep(100);
    }
    Действительно ли использовать второй предпочтительней когда начинает тормозить один из потоков (если прокси тормозит)?
    По моим тестам первый работает быстрее, но я не использовал прокси вообще.
    Нигде не могу найти значения констант: CURLM_CALL_MULTI_PERFORM, CURLM_OK, CURLMSG_DONE.

    PS: моя цель отсеивать нерабочие потоки при невалидном прокси.
     
  2. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Действительно. Обработка данных начнется как только будет готовы первые данные. Естественно, это сработает, только если вы начнете обработку внутри этого кода, а не будете складировать данные в массив, а обрабатывать уже после описанного кода.

    Константы на то и константы, чтобы их значение вас не интересовало, а были использованы их имена. Но если очень хочется, то "echo CURLM_OK;"
     
    _________________________