|
|
|
|
|
для: 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-
закачав их - отправляет браузеру всё вместе одним куском.
Ну или несколькими кусками, но все равно одним откликом. | |
|
|
|
|
|
|
|
для: Trianon
(13.06.2007 в 12:16)
| | По сути, мне надо просто разрешить скачивать несколько файлов, только авторизованным пользователям. Плюс еще хочется чтобы вся эта система поддерживала докачку. Вот и все, больших понтов не надо.
Так, вроде бы работает. Но ГетРайт оказался качать через этот скрипт....
Как выяснилось позже... отказ произошел, потому что в начале скрипта стоит функция контроля авторизации. Без нее качает... | |
|
|
|
|
|
|
|
для: Trianon
(13.06.2007 в 12:11)
| | >Он выдает два запроса параллельно и независимо. Каждый из запросов - простой фрагмент.
Т.е. когда ГетРайт разибвает на частьи файл, он делает несколько запросов. Т.е. за место одного такого:
Он делает два таких:
"bytes=500-700"
и
"bytes=601-999"
|
Так?
А такой запрос тогда, в каких случаях прменяется?
И как обрабатывается? Т.е. как выдать-то эти две части? | |
|
|
|
|
|
|
|
для: tAleks
(13.06.2007 в 12:04)
| | С практической точки зрения, Вам не в эти дебри теперь лезть надо.
Вам нужно реализовывать логику запроса HEAD и условных запросов
IF-modified-since
IF-unmodified-since
If-match
If-range
Без этого нормальное клиент-серверное взаимодействие на практике обеспечить сложно.
Особенно, если файлы у Вас могут меняться время от времени....
а также (если требуется защищенная загрузка) логику проверки кукисов.... | |
|
|
|
|
|
|
|
для: tAleks
(13.06.2007 в 12:04)
| | >Или нужно какими-нибудь отедльными потоками параллельно? Ведь например когда я качаю файл ГетРайтом, он разибвает его на части все части качает одновременно. Вот этого я еще не понял, как реализовать.
Он выдает два запроса параллельно и независимо. Каждый из запросов - простой фрагмент.
Первый (который начальную часть тянет) - возможно даже вообще нефрагментный, а обычный чистый GET | |
|
|
|
|
|
|
|
для: Trianon
(13.06.2007 в 11:54)
| | >Не надо прибедняться. Суть Вы уже поняли более чем капитально.
Как выдавать один запрощенный кусок - да. Понял.
А как выдавать 2 куска? В скрипте я вырезаю 2 куска, получаю их в переемнные: $part1 и $part2
Как их выдавать-то? Просто последовательно один за другим?
echo $part1;
echo $part2;
|
Или нужно какими-нибудь отедльными потоками параллельно? Ведь например когда я качаю файл ГетРайтом, он разибвает его на части все части качает одновременно. Вот этого я еще не понял, как реализовать. | |
|
|
|
|
|
|
|
для: tAleks
(13.06.2007 в 11:38)
| | >А не могли бы вы дать небольой примерчик, по выдачи нескольких частей, при таком запросе?
>Хотя бы чтобы суть понять.
Гы. Нет :)
Не надо прибедняться. Суть Вы уже поняли более чем капитально.
сиюминутной практической ценности для Вас этот пример не представляет, поскольку клиенты, проявляющие всё многообразие фантазии в рамках этого RFC - мне, например, просто не попадались. Полагаю, их вообще нет. Не каждый решится делать клиента, чтобы в самый разгар обмена данными получить в ответ весь файл ... или еще того хуже - статус 501 HTTP/1.1 Not implemented .
С долгоиграющей практической ценностью как поступать - Вы тоже знаете.
А я, если у cheops'а возникнет дефицит задач, предложу этот пример как очередную задачу. | |
|
|
|
|
|
|
|
для: Trianon
(13.06.2007 в 11:04)
| | >Следует отметить, что согласно синтаксиса, в строке могут попадаться пробелы...
А где эти пробелы могут быть? В любом месте? Тогда как правильно обработать эту строку и выбрать то, что нужно?
>>>Кроме того, этот код неполон, поскольку не обрабатывает мультидиапазонные запросы - очень редкий тип запросов, при котором клиент требует от сервера сразу несколько фрагментов.
>>Это когда $_SERVER['HTTP_RANGE'] = "bytes=500-700,601-999"? Так?
>Да.
А не могли бы вы дать небольой примерчик, по выдачи нескольких частей, при таком запросе? Хотя бы чтобы суть понять. | |
|
|
|
|
|
|
|
для: Trianon
(13.06.2007 в 10:36)
| | >>А просто выдать зарошенную часть (не хвост), без цикла нельзя?
>
>А как?
Ну прочитать сразу часть файла, и выдать ее. Например так:
$buffer = fread($handle, 500);
echo $buffer;
|
Ведь, как я понял, в вашем примере, в цикле, делается тоже самое, только запрошенная часть файла, выдается кусками по 16384 байта.
Или может, это сделано для того чтобы большой файл в память не грузить целиком? | |
|
|
|
|
|
|
|
для: tAleks
(13.06.2007 в 10:41)
| | >Привиедите пожалуйста пример строки, которая в орингинале лежит в $_SERVER['HTTP_RANGE']. Т.к. как я понимаю, то там лежит что то вроде: "что-то=500-900". Так?
Само поле заголовка может выглядеть так: с 2000 и до конца файла
201 байт с 500 по 700
300 последних байт
100 первых байт
или даже так
Range: bytes=2000-, 500-700, -300, 0-99
| все четыре диапазона сразу.
В $_SERVER['HTTP_RANGE'] лежит значение поля. То есть строка, начинающаяся с bytes.
например,
Следует отметить, что согласно синтаксиса, в строке могут попадаться пробелы...
>Т.е. если в $_SERVER['HTTP_RANGE'] лежит строка: "что-то=-900", то нужно выдать последине 900 байт файла?
>А если "что-то=0-900", то первые 900?
>Правильно понимаю?
именно так. Если вместо что-то поставить bytes - будет совсем правильно.
>>Кроме того, этот код неполон, поскольку не обрабатывает мультидиапазонные запросы - очень редкий тип запросов, при котором клиент требует от сервера сразу несколько фрагментов.
>Это когда $_SERVER['HTTP_RANGE'] = "bytes=500-700,601-999"? Так?
Да. | |
|
|
|
|