Xpoint
   [напомнить пароль]

отдача файлом через PHP или по прямому линку?

Метки: [без меток]
2007-06-18 21:07:55 [обр] Семенищев Андрей(2/2)[досье]

Есть такая ситуация, на сервер закачивается куча файлов (неважно какого типа, они потом скачиваться будут). есть 2 варианта отдачи этих файлов клиенту, через faked url (mod_rewrite) и отдача файла через скрипт php (через fopen & fread, чтобы получить реальное метоположение файла используется всего один запрос базе данных). Или указывать прямой линк на файл.

Так вот вопрос как работают эти 2 варианта?

Мое предположение (думаю, что может оно и ошибочным оказаться). Когда php черзе функцию fopen читает файл, а потом выводит его (не важно куда, на экран или для скачивания), то скрипт работает ровно столько, сколько надо, чтобы прочитать файл с винчестара и отдать его на устройство вывода (т.е. apache). А дальше уже apache отдает его клиенту (в зависимости от скорости клиента). И памяти создаваемая ветка апача берет не меньше чем размер файла.

И второй вариант, когда прямой линк на файл, апач забриает его в память и точно также отдает его клиенту (в зависимости от скорости).

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

Прошу или подтвердить мои мысли или разубедить меня в этом.

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

P.S. php как модуль apache на Linux системе.

спустя 13 минут [обр] Алексей Севрюков(162/1280)[досье]
Семенищев Андрей[досье] PHP процесс будет висеть до тех пор, пока клиент не заберет весь файл. Apache ничего не забирает у скрипта. Если есть возможность сделать чтобы файлы отдавались без скрипта - делайте, это намного экономичнее.
спустя 26 минут [обр] Семенищев Андрей(2/2)[досье]
Ну а по поводу потребления памяти и открытых веток apache?
спустя 1 час 1 минуту [обр] Давид Мзареулян(536/1003)[досье]

Семенищев Андрей[досье] Всё то время, пока клиент качает файл, соотв. апачный процесс будет сидеть в памяти. Файл в память не закачивается (если только Вы не делаете это явным образом в PHP-скрипте).

Вообще, для подобной раздачи рекомендую nginx или lighttpd - в них есть специальные механизмы как раз для этого (см. напр. http://blog.kovyrin.net/2006/1......el-redirect-php-rails/lang/ru/).

спустя 14 часов [обр] Алексей Севрюков(162/1280)[досье]

Семенищев Андрей[досье]

Ну а по поводу потребления памяти и открытых веток apache?

Все очевидно. Клиент запрашивает файл, Apache создает под запрос отдельный поток (который естественно висит в памяти), этот поток запускает PHP скрипт, который тоже ест память.

спустя 10 месяцев [обр] Иван Шабарин[досье]
При отдаче файла скриптом (через readfile(), например), стоит ли беспокоиться о том, что PHP-скрипт убьется по лимиту, а пользователь в это время еще не успел докачать файл?
спустя 12 часов [обр] Давид Мзареулян(536/1003)[досье]
Иван Шабарин[досье] Стоит.
Powered by POEM™ Engine Copyright © 2002-2005