Укажите на ошибку CURL PHP

12
A4
На сайте с 05.01.2012
Offline
55
1716

Уважаемые форумчане. Я пытаюсь в меру своих малых сил написать скрипт скачивания файла с удаленного сервера по частям. То есть сначала скачиваются 500кб, потом еще 500кб и так далее до конца файла... Для этого был написан вполне себе нормально работающий кусок кода:


$fsize = curl_get_file_size($file_url);//получаем размер файла(на удаленном сервере) в килобайтах
$iter = round($fsize/512000) + 1;//число проходов цикла до полной закачки файла частями по 500 килобайт +1 ибо округлению я не доверяю....

for($i=0;$i<$iter;$i++){//чисто для эксперимента взят цикл
cl_Read($file_url,$file_name,512000*$i,512000);

}
function cl_Read($url,$name, $position, $size) { //собсна сама функция скачки данных

$hdr = array("Range: bytes=".$position."-".($position + $size));
$fp = fopen ($name, 'ab');//ab - добавляет данные к концу файла
$ch = curl_init($url);#Закачиваемый файл
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, $hdr);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_REFERER, "http://vk.com/swf/audio_lite.swf?_stV=10");
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0");
$content = curl_exec($ch);
curl_close($ch);
fclose($fp);

return $content;
}

Файл скачивается, но! когда я пытаюсь его воспроизвести в flash плеере, то проигрываются только первые 500кб, хотя тот-же AIMP или winamp проигрывают файл полностью.

Если загружать файл не пакетами а целиком, то есть так


$fp = fopen ($file_name, 'w+');
$ch = curl_init($file_url);#Закачиваемый файл
curl_setopt($ch, CURLOPT_TIMEOUT, 29);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_REFERER, "http://vk.com/swf/audio_lite.swf?_stV=10");
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0");
curl_exec($ch);
curl_close($ch);
fclose($fp);

то flash player все нормально воспринимает. Объясните пожалуйста, почему первый код не работает как надо и почему flash плеер не хочет проигрывать музыку скачанную через такой алгоритм, хотя все остальные плееры его нормально воспроизводят?

siv1987
На сайте с 02.04.2009
Offline
427
#1

Сравните между собой скаченный файл целиком и файл скаченный частями, можете побайтово.

http://habrahabr.ru/post/138504/

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#2

Вполне может быть в этом проблема:

$fp = fopen ($name, 'ab');//ab - добавляет данные к концу файла

плееры могут пренебрегать этим, а флееш нет.

Попробуйте вместо этого file_put_contents это как бы уже давно современный вариант :)

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
A4
На сайте с 05.01.2012
Offline
55
#3
LEOnidUKG:
плееры могут пренебрегать этим, а флееш нет.

чем это пренебрегать то? Я могу написать выражение для очистки от ненужных символов внутренности файла. Только вот какой символ заставляет flashplayer остановитсья? EOF? Но ведь ни fclose ни curl_setopt($ch, CURLOPT_FILE, $fp); в конце записи данных символ EOF в поток не помещают, во всяком случае про это нигде не написано. Так в чем загвоздка то? о_0

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#4

Ну Вам же сказали вроде.

Частями выкачайте файл и сохраните на сервере, а потом к себе на комп.

Также скачайте через браузер этот файл. Сравните размеры. В плеере также посмотрите длительность обоих файлов. Вообщем провести сравнение! О результатах расскажите.

ЗЫ. коммент "+1 ибо округлению я не доверяю" просто убил😂

Подпись))
A
На сайте с 21.01.2009
Offline
31
#5

прочитал ваше извращение с курлом в цикле)) не совсем понял что вы имели ввиду по частям.

у меня была похожая задача, реализовывал отдачу mp3 файлов "налету" с контакта через свой сервер.

код не стал вставлять в сообщение, тут более читабельно:

http://pastebin.com/43VMsArf

надеюсь помог

siv1987
На сайте с 02.04.2009
Offline
427
#6

Код уг от того и


<html>
<head><title>416 Requested Range Not Satisfiable</title></head>
<body bgcolor="white">
<center><h1>416 Requested Range Not Satisfiable</h1></center>
<hr style="border: 0px none ; width: 100%; height: 1px; background-color: rgb(192, 192, 192);" />
<address>DataPalm/3.5</address>
</body>
</html>


$b = 512000;
$fsize = curl_get_file_size($file_url);
$iter = floor($fsize / $b);
$last = $b * $iter;
$last = ($fsize > $last) ? $fsize - $last : 0;

for($i=0; $i<$iter; $i++)
{
cl_Read($file_url, $file_name, $b*$i, $b);
}
if($last)
{
cl_Read($file_url, $file_name, $b*$i, $last);
}
A4
На сайте с 05.01.2012
Offline
55
#7
siv1987:
Код

Код пойдет) Но ничем от моего варианта практически не отличается, за исключением проверки. Результат тот же самый - Файл не проигрывается полностью, проигрываются только первые 20-30 секунд, что весьма странно. Может есть какой-то особый символ, который говорит флеш плееру - стоп?

Сравнивал скачанный файл и слепленный файл побайтово. И знаете что меня убило?

Размер слепленного файла - 3,67 МБ (3 854 426 байт)

Размер скачанного! файла - 3,75 МБ (3 936 951 байт)

То есть слепленный весит меньше! скачанного. Вот такого я точно не ожидал. Сравнивал на разных файлах, всегда размер слепленного меньше размера скачанного... Странно.

Кто-нибудь это может понять?

Я сам себе это объяснить не способен, если честно....

andygood, что-то ваш вариант не работает, хотя все равно спасибо что попробовали. Пишет 405 ошибку - not Allowed, жаль(

IL
На сайте с 20.04.2007
Offline
435
#8
$hdr = array("Range: bytes=".$position."-".($position + $size));

-1, не?

Если 10 байт с 0 то 0-9

Милованов Ю.С:
ЗЫ. коммент "+1 ибо округлению я не доверяю" просто убил

ну.. про floor/ceil, видимо не в курсе..

aftamat4ik:
То есть слепленный весит меньше! скачанного.

Разбираться, почему.. на разных файлах разный размер.

$fsize = curl_get_file_size($file_url);//получаем размер файла(на удаленном сервере) в килобайтах

Почему в килобайтах? И что за функция? почему не http://php.net/manual/pt_BR/function.curl-getinfo.php ?

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
siv1987
На сайте с 02.04.2009
Offline
427
#9

512001 байт отличается от оригинального, повторяется байт с позиции 512000, так что ivan-lev прав - капайте в сторону правлильного Range: bytes. Ну и конечно нормальный цикл сделайте, выше привели вариант "практически ничем ни отличающийся".

IL
На сайте с 20.04.2007
Offline
435
#10
siv1987:
512001 байт отличается от оригинального,

512000, похоже, лечится исправлением на 2.. видимо, поправки на +1 оказалось недостаточно 😂

	$iter = round($fsize/512000) + 1;//число проходов цикла до полной закачки файла

частями по 500 килобайт +1 ибо округлению я не доверяю....
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий