Скачивание больших файлов.

Solid

Drosera anglica
Скачивание больших файлов.

Во время отладки скрипта, который скачивал файл через обычную функцию:
PHP:
function get_url($url) {
	//$url = str_replace(' ', '%20', $url);
	$data = '';

	$fp = fopen($url, 'r');
	if($fp) {
		while (!feof($fp)) {
			$data .= fread($fp, (1024*1024));
		}
		fclose($fp);
	} else {
		$data = get_url($url);
	}

	return $data;
}
столкнулся с проблеммой сильной загруженностью процессора. Где-то после 3 мегобайт скаченной информации загруженность процессора начинает увеличиваться, причём очень быстро.
Попытался изменить функцию на:
PHP:
function get_file($url) {
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_HEADER, 0);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   $result = curl_exec($ch);
   curl_close($ch);
   return $result;
}
почти тот же результат. Даже не почти, а точно такой же.
Единственное что пришло на ум, использовать:
PHP:
system('wget '.$url);
Может быть у кого-то есть другие соображения?
 

white phoenix

Новичок
Solid
> while (!feof($fp))
Чисто подумалось... ситуация: коннект установлен, в цикле читаешь данные, далее коннект рвётся и feof всё равно возвращает FALSE, и получаем бесконечный цикл, что приводит к чрезмерной загрузке процессора.
 

Solid

Drosera anglica
Именно, что процессор загружается не на всю мощность, т.е. загруженность колеблеться в районе 50-80%. Если бы был бесконечный цикл, то загруженность была бы 100%.
Хотя с разрывом соединения я не понял - такое точно может быть? На будущее.

-~{}~ 17.01.06 21:12:

Тем более файл качается...
 

white phoenix

Новичок
Solid
Ну 100% в любом случае нельзя, только 99%, но суть не в этом. Бесконечный цикл может кушать и 50-80%, от машины зависит. Тем не менее устрани вышеописанный баг.
 

Solid

Drosera anglica
Он не решает, ровным счётом, ничего. Тем более - разве это баг?
 

Solid

Drosera anglica
Хм... зачем мне отладка приложения? Я и так знаю, что у меня всё отлично работает и без ошибок. Скорее всего всё дело в том, что после 3мб, append происходит медленнее вот и всё. Хотя с другой стороны curl тоже тормозит. Мне хотя бы с curlом разобраться, я до fopen и fsockopen допру как-нибудь...
 

SelenIT

IT-лунатик :)
Solid
А что с этим файлом потом предстоит делать?
Если надо просто скопировать его к себе на сервер, ИМХО, не обязательно грузить его в память целиком...
 

Solid

Drosera anglica
Тоже вариант. Даже как-то не подумал. Спасибо за дельный совет.

-~{}~ 17.01.06 22:23:

С cURL, по видимому, тогда ничего не получается...
 
Сверху