Задать вопрос
@madc0de

Пропускает ссылки. В чем проблема multicurl?

Добрый день! Есть код:
function http_load( $urls, $callback = false ) {
    $mh = curl_multi_init();
    $chs = array();

    foreach ( $urls as $url ) {
      $chs[] = ( $ch = curl_init() );
      $useragent="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1";

      curl_setopt( $ch, CURLOPT_USERAGENT, $useragent);
      curl_setopt( $ch, CURLOPT_URL, $url );
      curl_setopt( $ch, CURLOPT_HEADER, 0 );
      curl_setopt( $ch, CURLOPT_HTTPGET, 1);
      curl_setopt( $ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
      curl_setopt( $ch, CURLOPT_DNS_USE_GLOBAL_CACHE, false );
      curl_setopt( $ch, CURLOPT_DNS_CACHE_TIMEOUT, 2 );
      curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
      curl_multi_add_handle( $mh, $ch );
    }

    $results = array();
        
    $prev_running = $running = null;

    do {
      curl_multi_exec( $mh, $running );
            
      if ( $running != $prev_running ) {
        $info = curl_multi_info_read( $mh );

        if ( is_array( $info ) && ( $ch = $info['handle'] ) ) {
          $content = curl_multi_getcontent( $ch );       
          $url = curl_getinfo( $ch, CURLINFO_EFFECTIVE_URL );  
          $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
          $o = curl_getinfo($ch);
          if( $httpCode == 200 ) {

            $item = str_get_html( $content );
            ... код парсера
            $results[] = array( 'url' => $url, 'description' => $description, 'attr' => $attr, 'vendor_id' => $vendor_id );
          }elseif( !empty( curl_error( $ch ) ) ){
            $error[] = array( 'url' => $url, 'error' => curl_error( $ch ) );            
          }else{
            $error[] = array( 'url' => $url, 'error' => curl_error( $ch ) );            
          }
        }
        
        $prev_running = $running;
      }
    
    } while ( $running > 0 );
        
    foreach ( $chs as $ch ) {
        curl_multi_remove_handle( $mh, $ch );
        curl_close( $ch );
    }
    curl_multi_close( $mh );

    if( empty( $results ) ) $results = '';
    if( empty( $error ) ) $error = '';

    return array( 'success' => $results, 'error' => $error );

  }


Не пойму переписывла 10 раз уже, пробовал задержки, слип ставить.
В итоге при тесте

Имеем 20 ссылок в массиве $urls
В $result попадают разное колличество всегда от 9 до 20.

Не понятно, куда пропадают остальные, в $error 0 или 1 всегда.

Как отследить и заставить правильно работать скрипт?
  • Вопрос задан
  • 92 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
@ubx7b8
Не понятно, для чего prev_running . Это не номер задачи, а всего лишь флаг.
Закомментируйте (уберите) все строчки, связанные с prev_running (закомментировать только "$prev_running = $running;" мало)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы