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

Сказать браузеру начать загрузку при получении первого chunk из cURL в php?

Привет, я пытаюсь скачивать файл в бразуер через скрипт (типа прокси) на хоcтинге. Но когда я скачиваю большие файлы, cURL сначала скачивает весь файл сначала в пямять php а потом отдает. Изза этого я теряю очень много времени а прифайлах размера больше 500 мб, сервер выдает 500 ошибку.

ПОЖАЛУЙСТА! Помогите изменить код так что бы как только cURL получить первый кусок файла сразу отдавал в браузер а не ждал что бы скачался весь файл.

Код:
/*header("Content-Disposition: attachment; filename=\"How to Use Git and GitHub Videos.zip\"");
header("Content-type: application/octet-stream");
header("Content-Transfer-Encoding: binary");*/

$url = "http://zips.udacity-data.com/ud775/How%20to%20Use%20Git%20and%20GitHub%20Videos.zip";

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
//curl_setopt($ch, CURLOPT_BUFFERSIZE, (1024*1024));
/*curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $buffer) {
  echo $buffer;
  ob_flush(); 
  flush(); 
  return strlen($buffer);
});*/

curl_exec ($ch);
curl_close($ch);
  • Вопрос задан
  • 284 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
chlp
@chlp
фулстек
У меня ваш код заработал. Вместо вывода блоков данных поставил вывод их длины, в консоль посыпались размеры блоков.
<?php
header("Content-Disposition: attachment; filename=\"How to Use Git and GitHub Videos.zip\"");
header("Content-type: application/octet-stream");
header("Content-Transfer-Encoding: binary");

$url = "http://zips.udacity-data.com/ud775/How%20to%20Use%20Git%20and%20GitHub%20Videos.zip";

$ch = curl_init();
ob_start();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_BUFFERSIZE, (1024*1024));
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $buffer) {
  echo strlen($buffer)."\r\n";
  ob_flush();
  flush();
  return strlen($buffer);
});

curl_exec ($ch);
curl_close($ch);


Возможно, не хватало явного ob_start(). Если все равно нет, то смотрите настройки веб-сервера (например, в php.ini output_buffering = Off, zlib.output_compression = Off).
Ответ написан
Ваш ответ на вопрос

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

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