Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Что такое $_SERVER['HTTP_RANGE']?

Сообщения:  [1-10]    [11-20]  [21-21] 

 
 автор: Trianon   (13.06.2007 в 12:42)   письмо автору
 
   для: tAleks   (13.06.2007 в 12:21)
 

Допустим Вы закачиваете файл с сервера site.com через прокси-сервер proxy.com
Допустим, Ваш гетрайт (или как его) принимая 500 килобайтовый файл решил нашинковать канал запросами по 100 килобайт (для простоты пусть килобайт это 1000 байт)
Он выпустит запросы к proxy.com следующих диапазонов:
Range: bytes=0-
Range: bytes=100000-
Range: bytes=200000-
Range: bytes=300000-
Range: bytes=400000-

Прокси продубликует эти запросы серверу сайта.

Допустим также, что первый, третий и пятый запросы от прокси к серверу сайта по каким-то причинам отвалились, даже не начавшись.
Погоревав, Вы пришибли закачку . Прокси, пришиб выпущенные запросы, успев затянуть к себе вторую и четвертую часть.

Потом через часок Вы решаете попробовать затянуть файл снова - обычным браузером безо всякого гетрайта.
IE выдает GET в сторону прокси.
Прокси думает, вторая, четвертая части у меня уже закешированы. Надо бы раздобыть первую, третью, и пятую.
И запрашивает у site.com Range: bytes=0-99999,200000-299999,400000-
закачав их - отправляет браузеру всё вместе одним куском.
Ну или несколькими кусками, но все равно одним откликом.

   
 
 автор: tAleks   (13.06.2007 в 12:37)   письмо автору
 
   для: Trianon   (13.06.2007 в 12:16)
 

По сути, мне надо просто разрешить скачивать несколько файлов, только авторизованным пользователям. Плюс еще хочется чтобы вся эта система поддерживала докачку. Вот и все, больших понтов не надо.

Так, вроде бы работает. Но ГетРайт оказался качать через этот скрипт....

Как выяснилось позже... отказ произошел, потому что в начале скрипта стоит функция контроля авторизации. Без нее качает...

   
 
 автор: tAleks   (13.06.2007 в 12:21)   письмо автору
 
   для: Trianon   (13.06.2007 в 12:11)
 

>Он выдает два запроса параллельно и независимо. Каждый из запросов - простой фрагмент.

Т.е. когда ГетРайт разибвает на частьи файл, он делает несколько запросов. Т.е. за место одного такого:

"bytes=500-700,601-999"


Он делает два таких:

"bytes=500-700"
и
"bytes=601-999"


Так?

А такой запрос тогда, в каких случаях прменяется?

"bytes=500-700,601-999"


И как обрабатывается? Т.е. как выдать-то эти две части?

   
 
 автор: Trianon   (13.06.2007 в 12:16)   письмо автору
 
   для: tAleks   (13.06.2007 в 12:04)
 

С практической точки зрения, Вам не в эти дебри теперь лезть надо.
Вам нужно реализовывать логику запроса HEAD и условных запросов
IF-modified-since
IF-unmodified-since
If-match
If-range
Без этого нормальное клиент-серверное взаимодействие на практике обеспечить сложно.
Особенно, если файлы у Вас могут меняться время от времени....
а также (если требуется защищенная загрузка) логику проверки кукисов....

   
 
 автор: Trianon   (13.06.2007 в 12:11)   письмо автору
 
   для: tAleks   (13.06.2007 в 12:04)
 

>Или нужно какими-нибудь отедльными потоками параллельно? Ведь например когда я качаю файл ГетРайтом, он разибвает его на части все части качает одновременно. Вот этого я еще не понял, как реализовать.

Он выдает два запроса параллельно и независимо. Каждый из запросов - простой фрагмент.

Первый (который начальную часть тянет) - возможно даже вообще нефрагментный, а обычный чистый GET

   
 
 автор: tAleks   (13.06.2007 в 12:04)   письмо автору
 
   для: Trianon   (13.06.2007 в 11:54)
 

>Не надо прибедняться. Суть Вы уже поняли более чем капитально.

Как выдавать один запрощенный кусок - да. Понял.

А как выдавать 2 куска? В скрипте я вырезаю 2 куска, получаю их в переемнные: $part1 и $part2

Как их выдавать-то? Просто последовательно один за другим?

echo $part1;
echo $part2;


Или нужно какими-нибудь отедльными потоками параллельно? Ведь например когда я качаю файл ГетРайтом, он разибвает его на части все части качает одновременно. Вот этого я еще не понял, как реализовать.

   
 
 автор: Trianon   (13.06.2007 в 11:54)   письмо автору
 
   для: tAleks   (13.06.2007 в 11:38)
 

>А не могли бы вы дать небольой примерчик, по выдачи нескольких частей, при таком запросе?
>Хотя бы чтобы суть понять.

Гы. Нет :)
Не надо прибедняться. Суть Вы уже поняли более чем капитально.
сиюминутной практической ценности для Вас этот пример не представляет, поскольку клиенты, проявляющие всё многообразие фантазии в рамках этого RFC - мне, например, просто не попадались. Полагаю, их вообще нет. Не каждый решится делать клиента, чтобы в самый разгар обмена данными получить в ответ весь файл ... или еще того хуже - статус 501 HTTP/1.1 Not implemented .

С долгоиграющей практической ценностью как поступать - Вы тоже знаете.

А я, если у cheops'а возникнет дефицит задач, предложу этот пример как очередную задачу.

   
 
 автор: tAleks   (13.06.2007 в 11:38)   письмо автору
 
   для: Trianon   (13.06.2007 в 11:04)
 

>Следует отметить, что согласно синтаксиса, в строке могут попадаться пробелы...

А где эти пробелы могут быть? В любом месте? Тогда как правильно обработать эту строку и выбрать то, что нужно?


>>>Кроме того, этот код неполон, поскольку не обрабатывает мультидиапазонные запросы - очень редкий тип запросов, при котором клиент требует от сервера сразу несколько фрагментов.
>>Это когда $_SERVER['HTTP_RANGE'] = "bytes=500-700,601-999"? Так?
>Да.

А не могли бы вы дать небольой примерчик, по выдачи нескольких частей, при таком запросе? Хотя бы чтобы суть понять.

   
 
 автор: tAleks   (13.06.2007 в 11:33)   письмо автору
 
   для: Trianon   (13.06.2007 в 10:36)
 

>>А просто выдать зарошенную часть (не хвост), без цикла нельзя?
>
>А как?

Ну прочитать сразу часть файла, и выдать ее. Например так:


$buffer = fread($handle, 500);
echo $buffer;


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

Или может, это сделано для того чтобы большой файл в память не грузить целиком?

   
 
 автор: Trianon   (13.06.2007 в 11:04)   письмо автору
 
   для: tAleks   (13.06.2007 в 10:41)
 

>Привиедите пожалуйста пример строки, которая в орингинале лежит в $_SERVER['HTTP_RANGE']. Т.к. как я понимаю, то там лежит что то вроде: "что-то=500-900". Так?

Само поле заголовка может выглядеть так:
Range: bytes=2000-
с 2000 и до конца файла

Range: bytes=500-700
201 байт с 500 по 700

Range: bytes=-300
300 последних байт

Range: bytes=0-99
100 первых байт

или даже так
Range: bytes=2000-, 500-700, -300, 0-99
все четыре диапазона сразу.

В $_SERVER['HTTP_RANGE'] лежит значение поля. То есть строка, начинающаяся с bytes.
например,
bytes=2000-


Следует отметить, что согласно синтаксиса, в строке могут попадаться пробелы...


>Т.е. если в $_SERVER['HTTP_RANGE'] лежит строка: "что-то=-900", то нужно выдать последине 900 байт файла?
>А если "что-то=0-900", то первые 900?
>Правильно понимаю?

именно так. Если вместо что-то поставить bytes - будет совсем правильно.


>>Кроме того, этот код неполон, поскольку не обрабатывает мультидиапазонные запросы - очень редкий тип запросов, при котором клиент требует от сервера сразу несколько фрагментов.
>Это когда $_SERVER['HTTP_RANGE'] = "bytes=500-700,601-999"? Так?
Да.

   

Сообщения:  [1-10]    [11-20]  [21-21] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования