Я хочу отправлять/передавать файлы с другого веб-сайта или веб-сайта непосредственно пользователю без сохранения файлов на моем сервере. Файлы - это архивы размером от 100 МБ до 1 ГБ
Загрузка одним потоком отлично работает. Вот мой код:
$ch5 = curl_init();
if (isset($_SERVER['HTTP_RANGE'])) {
//http://stackoverflow.com/questions/157318/resumable-downloads-when-using-php-to-send-the-file
preg_match('/bytes=(\d+)-(\d+)?/', $_SERVER['HTTP_RANGE'], $matches);
$offset = intval($matches[1]);
$end = $matches[2] || $matches[2] === '0' ? intval($matches[2]) : $size - 1;
curl_setopt($ch5, CURLOPT_RANGE, "$offset-$end");
}
curl_setopt($ch5, CURLOPT_URL, $direct_link);
curl_setopt($ch5, CURLOPT_TIMEOUT, 3550);
curl_setopt($ch5, CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($ch5, CURLOPT_HEADERFUNCTION, 'readHeader');
curl_exec($ch5);
$dlsize = curl_getinfo($ch5,CURLINFO_SIZE_DOWNLOAD );
$time = curl_getinfo($ch5,CURLINFO_TOTAL_TIME);
curl_close($ch5);
function readHeader($ch, $header) // Send header from the Downloaded file to the User
{
header($header);
return strlen($header);
}
Проблема в том, что PHP Загрузить полный файл, если запрос содержит диапазон, например "Range: bytes = 0-", и отправляет его пользователю. Но загрузка пользователя намного медленнее (Cause slower download speed), а затем загружает его на мой сервер, но если файл полностью загружен, файл недоступен на внешнем сервере. И когда клиент делает запрос диапазона для второй половины или что-то еще, запрос переходит на внешний сервер, и файл недоступен, потому что он уже полностью загружен первым запросом, но я не могу получить доступ к данным или есть способ получить эти данные, не сохраняя их на моем диске?
Я хочу сохранить Bandwidth, чтобы дать пользователям возможность делать запросы диапазона. Поэтому PHP должен загружать только то количество, которое пользователь действительно хочет загрузить или установить прямое соединение между внешним сервером и пользователем.
На самом деле я использую nginx/1.6.2 и PHP 5.5.2 0- 1 на Ubuntu 12.04.5
Я решил свою проблему, используя nginx с X-Sendfile/X-Accel-Redirect. Дополнительная информация здесь: wiki.nginx.org/XSendfile