Multithreaded cURL complete checking

Статус
В этой теме нельзя размещать новые ответы.

Solid

Drosera anglica
Multithreaded cURL complete checking

Каким образом можно узнать - скачались ли все данные со всех ссылок?

В данный момент делаю что-то вроде:

PHP:
function get_url($url) {
	//$start = microtime(true);
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_HEADER, 0);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 400);
	$result = curl_exec($ch);
	curl_close($ch);
	if(empty($result)) {
		$result = get_url($url);
	}
	//echo microtime(true)-$start;
	return $result;
}

function get_url_multi($urls) {
	//echo 'multi is working... ';
	$mh = curl_multi_init();
	


	foreach ($urls as $i => $url) {
		$conn[$i] = curl_init($url);
		curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER, 1);
		
		curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT, 400);
		curl_setopt($conn[$i], CURLOPT_HEADER, 0);
		
		curl_multi_add_handle ($mh,$conn[$i]);
	}

	// start performing the request
	do {
		$mrc = curl_multi_exec($mh, $active);
	} while ($mrc == CURLM_CALL_MULTI_PERFORM);

	while ($active and $mrc == CURLM_OK) {
		// wait for network
		if (curl_multi_select($mh) != -1) {
			// pull in any new data, or at least handle timeouts
			do {
				$mrc = curl_multi_exec($mh, $active);
			} while ($mrc == CURLM_CALL_MULTI_PERFORM);
		}
	}

	if ($mrc != CURLM_OK) {
		print "Curl multi read error $mrc\n";
	}

	// retrieve data
	foreach ($urls as $i => $url) {
		if (($err = curl_error($conn[$i])) == '') {
			$res[$i]=curl_multi_getcontent($conn[$i]);
			if(empty($res[$i])) {
				$res[$i] = get_url($urls[$i]);
			}
		} else {
			if(empty($res[$i])) {
				$res[$i] = get_url($urls[$i]);
			}
		}
		curl_multi_remove_handle($mh,$conn[$i]);
		curl_close($conn[$i]);
	}
	curl_multi_close($mh);
	
	return $res;
}
Использование:
PHP:
get_url_multi(array('http://www.phpclub.ru/', 'http://phpconf.ru/', 'http://phpinside.ru'));
Всё работает хорошо, и лишь изредка некоторые страницы не скачиваються, или не докачиваються.

Возможно кто-то уже сталкивался с подобной проблеммой.

Спасибо.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху