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

Multi_curl пропускает запросы, почему?

Есть скрипт, вроде работает, но пропускает от 1-5% запросов, а нужно чтобы были загружены 100%
В чем может быть причина?Или какая-то альтернатива?

const THREADS = 30;
       const  TIMEOUT = 20;
        unset($urls_pack);
	$data = [];
	$urls_pack = [ ];
	for( $i = 0; $i < count( $org_data ); $i = $i + THREADS ) {
		$urls_pack[] = array_slice( $org_data, $i, THREADS );
	}
	foreach( $urls_pack as $pack ) {
		$mh = curl_multi_init();
		unset( $conn );

		foreach( $pack as $i => $url ) {
			$conn[ $i ] = curl_init( trim( $url[ 'url' ] ) );

			curl_setopt( $conn[ $i ], CURLOPT_RETURNTRANSFER, 1 );
			curl_setopt( $conn[ $i ], CURLOPT_TIMEOUT, TIMEOUT );
			curl_setopt( $conn[ $i ],  CURLOPT_HEADER, false);
			curl_multi_add_handle( $mh, $conn[ $i ] );
		}
		$active = null;
		do {
			usleep( 5000 );
			$mrc = curl_multi_exec( $mh, $active );
		} while ( $mrc == CURLM_CALL_MULTI_PERFORM );

		while ( $active && $mrc == CURLM_OK ) {

			if ( curl_multi_select( $mh ) == -1 ) {
				usleep( 10000 );
			}

			do {
				$mrc = curl_multi_exec( $mh, $active );
			} while ( $mrc == CURLM_CALL_MULTI_PERFORM );
		}

		foreach( $pack as $i => $url ) {
			$result = curl_multi_getcontent( $conn[ $i ] );
			$current_data = json_decode( $result, true );
			if( !$current_data ) {
				continue;
			}
			foreach( $current_data as $item ) {
				.........
			}

		}
		curl_multi_close( $mh );
	}
  • Вопрос задан
  • 223 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
4utka_pyan
@4utka_pyan
Может не пропускает, а просто ответ не приходит, или приходит с таймаутом превышающим допустимый? Альтернатива - проверять на корректность ответа каждый ответ и если он не пришёл делать запрос повторно, правда с Multi_curl как раз это несколько геморно проще сделать в одном curl но несколько параллельных скриптов тогда уж.
Ответ написан
Ваш ответ на вопрос

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

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