отдача больших файлов (php + nginx)

1. ramzes (19.02.2012 / 18:39)
ребят, кто сталкивался, можете набросать примерный код?
ни когда даже не интересовался, не знаю с чего начать

2. Саня (19.02.2012 / 19:08)
Глянь тут http://habrahabr.ru/blogs/nginx/ есть много годных конфигов.

3. Александр (19.02.2012 / 19:20)
fread() же
 <?php
$f= fopen('file.avi', 'rb');
while (!feof($f)){
  echo fread($f, 81920);
}
fclose($f);
?>


4. ramzes (19.02.2012 / 19:37)
Муз-ТВ (19 Февраля 2012 / 19:20)
fread() же
 <?php
$f= fopen('file.avi', 'rb');
while (!feof($f)){
  echo fread($f, 81920);
}
fclose($f);
?>
Не не, это я и сам могуsmile можно просто readfile() эффект примерно тот же.
Надо именно нигс, и еще интересно, на хосте можно или надо свой сервак?

Добавлено через 00:38 сек.
sanzstez (19 Февраля 2012 / 19:08)
Глянь тут http://habrahabr.ru/blogs/nginx/ есть много годных конфигов.
Спасибо, почитаюsmile

5. Александр (19.02.2012 / 20:12)
4, readfile() вроде как стразу всё в память, а тут понемногу. В nginx есть какие то отличия в плане работы php в данном случаи?

6. ramzes (19.02.2012 / 22:55)
Муз-ТВ (19 Февраля 2012 / 20:12)
4, readfile() вроде как стразу всё в память, а тут понемногу. В nginx есть какие то отличия в плане работы php в данном случаи?
по моему нет, он поочередно по частям читает.
я всегда так думал. надо будет уточнить..

7. ктулху (19.02.2012 / 22:57)
не не не, вы фигню шпарите.
header("X-Accel-Redirect: /path/to/file"); # путь от документрута.
nginx сам отдаст файл, а скрипт завершится.

Добавлено через 01:47 сек.
Главное чтобы файл хранится с реальным расширением, ибо помоему заголовки с указанием типа не воспринимаются =( надо тестировать

8. ramzes (19.02.2012 / 23:21)
7. ShiftBHT, а в конфиге нигса не надо ни чего править?

9. finall2 (20.02.2012 / 10:06)
8. Нет, не надо.
А так. вещь хорошая, избавила от надобности отдавать PHP скриптом по несколько десятков ГБ ежедневноsmile

10. ктулху (20.02.2012 / 20:38)
8, не надо. если немного погуглишь, то научишся ещё и ограничение по скорости так же делать.

11. Кевин Митник (20.02.2012 / 20:53)
7,9,10 - респект) то же написать хотел)

12. ramzes (20.02.2012 / 20:57)
Огрвничений мне не надо, а вот гглить больше не буду, гугл мусорка а не поисковик, выдает бред всякий с настройкой конфигов и т.д.
По тому и прошу примерный код:-[

13. Тимофей (20.02.2012 / 21:05)
ramzes (20 Февраля 2012 / 20:57)
Огрвничений мне не надо, а вот гглить больше не буду, гугл мусорка а не поисковик, выдает бред всякий с настройкой конфигов и т.д.
По тому и прошу примерный код:-[
вот почитай,довольно подробно вроде как
http://phpclub.ru/talk/threads/Отдача-статики-скриптом-Что-лучше.54964/

14. Дмитрий (20.02.2012 / 21:17)
Попробуйте через специализированные заголовки, как альтернатива фреду в цикле заголовки типа икс-сендфиле, работает на уровне сервера сам лично опыта не имею

15. Ant0ha (20.02.2012 / 21:20)
ramzes (20 Февраля 2012 / 20:57)
Огрвничений мне не надо, а вот гглить больше не буду, гугл мусорка а не поисковик, выдает бред всякий с настройкой конфигов и т.д.

А может дело в тебе ;/ Какой запрос, такой и ответ) php кода и не должно быть при отдаче статики)

16. Дмитрий (20.02.2012 / 21:23)
Т.е очевидно должны быть контент-тип, диспонсион и сам икс-сенд где и указывать пути к файлу
размер файла и подобное не передается в заголовка .....

17. ramzes (20.02.2012 / 21:31)
akawin (20 Февраля 2012 / 21:17)
заголовки типа икс-сендфиле, работает на уровне сервера
А подробнее можно?

Добавлено через 05:10 сек.
Ant0ha (20 Февраля 2012 / 21:20)

А может дело в тебе ;/ Какой запрос, такой и ответ) php кода и не должно быть при отдаче статики)
мне не нужно "как должно быть" мне нужно, как необходимо.
Где ты хоть слово о статике увидел?
Улови разницу.
К чему был этот высер?

18. Дмитрий (20.02.2012 / 21:40)
17. ramzes, Ну как обычно ты файл отдаешь? передаешь нужные заголовки- отменяешь кэширование браузером, размер фаила, тип, название, дата модификации потом печатаешь echo file get contents или readfile или while(fread - php сам пишет файл в буфер и отдает, а тут вроде такой есть заголовок x-sendfile: fail.avi он то и определяет передачу, но тип файла передавать скорее всего надо что бы ясно было браузеру, а насчет дальнейшего участия php не уверен возможно нужно завершать работу сразу после отправки заголовка die or exit(статус-код)
но это лишь теория опыта мне не пришлось еще набраться :-)

19. ктулху (20.02.2012 / 21:42)
17, опиши плиз задачу. чем не устраивает вариант с X-Accel-Redirect? помоему хороший вариант, есть аналог для апача (можно предусмотреть и работу скрипта без nginx).

20. Ant0ha (20.02.2012 / 21:43)
17. ramzes, высер? оу оу, попридержи лошадей) у тебя гиговые файлы != статика? тогда что же это?

Добавлено через 00:30 сек.
сначала обиделся на гугл, теперь на меня)

Добавлено через 05:23 сек.
небольшую поправку уже высером называют) надо быть хоть немного самокритичным

21. ramzes (20.02.2012 / 21:51)
Ant0ha (20 Февраля 2012 / 21:43)
17. ramzes, высер? оу оу, попридержи лошадей) у тебя гиговые файлы != статика? тогда что же это?

Добавлено через 00:30 сек.
сначала обиделся на гугл, теперь на меня)
1. Обменник.
2. Я яндекс предпочитаю.
3. Обижаются дети.
____
Артем, у меня файл вида md5_file(), в папке с deny from all
И без всяких расширений.
Файлы любые, и php тоже

22. ramzes (20.02.2012 / 22:50)
akawin (20 Февраля 2012 / 21:40)
x-sendfile: fail.avi
попробовал
правда на денвере, но файл отдает пустойsad 0 байт

23. Дмитрий (20.02.2012 / 23:30)
22. ramzes, Но ведь отдает файл? уже хорошо :-)

24. ramzes (20.02.2012 / 23:45)
akawin (20 Февраля 2012 / 23:30)
22. ramzes, Но ведь отдает файл? уже хорошо :-)
да нет ни чего он не отдает как раз.
просто заголовки же идут на отдачу и все. а контент нулевой((
и вроде все верно..

<?
$ftime = gmdate("D, d M Y H:i:s", filemtime('files/'.$file['md5']))." GMT";
                header('Cache-control:  public');
                header('Content-Length: '.$file['file_size']);
                header('Last-Modified: '.$ftime);
                header('Expires: 0');
                header('Cache-Control: must-revalidate');
                header('Pragma: public');

                header("Content-Type: application/octet-stream");
                header('Content-Description: File Transfer');
                header('Content-Disposition: attachment; filename='.$_SERVER['HTTP_HOST'].'_'.valid_filename($file['file_name']));
                header('Content-Transfer-Encoding: binary');
                header('X-Sendfile: files/'.$file['md5']);
                //header('X-Accel-Redirect: files/'.$file['md5']);


25. ramzes (21.02.2012 / 00:04)
в общем завелся по методу Артема, Шифтаsmile
теперь другая проблема, пришлось убрать дени фром алл
как организовать безопасное хранение?

26. ramzes (21.02.2012 / 00:23)
ShiftBHT
Главное чтобы файл хранится с реальным расширением, ибо помоему заголовки с указанием типа не воспринимаются =( надо тестировать
Проверил, с заголовками все отлично, он их наследует от скриптаsmile

27. ктулху (21.02.2012 / 05:44)
а чем оно не безопасно? оставь deny from all в .htaccess, и доступа минуя nginx туда не будет, nginx отправит запрос апачу (ибо не попадёт под регулярку статики)

28. ramzes (21.02.2012 / 08:40)
ShiftBHT (21 Февраля 2012 / 05:44)
а чем оно не безопасно? оставь deny from all в .htaccess, и доступа минуя nginx туда не будет, nginx отправит запрос апачу (ибо не попадёт под регулярку статики)
с дени фром алл нигс отдает пустой файл

URL: https://visavi.net/topics/29740