- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
VK приобрела 70% в структуре компании-разработчика red_mad_robot
Которая участвовала в создании RuStore
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Дано: ubuntu 11.10, apache2.2, mod_php
Задача: отдать юзеру файл находящийся на http://othersite.ru с помощью php скрипта находящемся на http:://mysite.ru.
Текущая реализация:
header("Content-disposition:attachment ... и т.д.").
с помощью curl считывается файлик на удаленном сервере и с помощью echo выдается юзеру.
Проблема:
Если файлик весит >100 МБ то процесс затягивается и процесс апача, который выполняет скрипт висит все время скачки в памяти.
Если способ не держать процесс апача в памяти на протяжении всего скачивания файла? Например скачивать файлик со скоростью большей чем у юзера, складывать его в какой-нибудь буфер на диске, и уже оттуда продолжить отдачу.
По опыту использования извращенных систем php-прокси.
Curl скачивает весь файл в память и отдае его из памяти, поэтому может вываливаться из-за недостата памяти на больших файлах.
Можно отдавать файлы через сокеты - они у меня по памяти никогда не вываливались, даже на шаре хостинге.
Это мой личный практический опыт.
При запросе файла запустить отдельным потоком его скачку (вплоть до wget-а, хотя лучше fopen/fgets - что бы легко контроллировать скачку и была возможность ее остановить если вдруг файл юзеру уже не нужен) и получить его размер (получив заголовки с удаленного сервера например, что бы знать когда файл уже скачан полностью). После этого в основном потоке отдавать файл по мере его поступления в файловую систему (т.е. если запрашивают уже несуществующие части, то ждать пока они появятся). При чем в таком виде намного проще поддерживать многопоточность (а с этим наверняка сталкиваетесь, даже если не замечаете).
Отдавать файл разумеется надо считывая и отдавая его небольшими кусочками, тогда даже на php сам скрипт отдачи файла больше пары мегабайт не займет.
По опыту использования извращенных систем php-прокси.
Curl скачивает весь файл в память и отдае его из памяти, поэтому может вываливаться из-за недостата памяти на больших файлах.
Можно отдавать файлы через сокеты - они у меня по памяти никогда не вываливались, даже на шаре хостинге.
Это мой личный практический опыт.
При запросе файла запустить отдельным потоком его скачку (вплоть до wget-а, хотя лучше fopen/fgets - что бы легко контроллировать скачку и была возможность ее остановить если вдруг файл юзеру уже не нужен) и получить его размер (получив заголовки с удаленного сервера например, что бы знать когда файл уже скачан полностью). После этого в основном потоке отдавать файл по мере его поступления в файловую систему (т.е. если запрашивают уже несуществующие части, то ждать пока они появятся). При чем в таком виде намного проще поддерживать многопоточность (а с этим наверняка сталкиваетесь, даже если не замечаете).
Отдавать файл разумеется надо считывая и отдавая его небольшими кусочками, тогда даже на php сам скрипт отдачи файла больше пары мегабайт не займет.
А не могли бы вы показать простой пример реализующий описанные вами способы ?
Если способ не держать процесс апача в памяти на протяжении всего скачивания файла?
Случая два: канал между клиентом и вами уже, чем между вами и mysite. И, соответственно, наоборот. Думаю, первый вариант будет встречаться гораздо чаще. Какой смысл предварительно скачивать файл, если тот же самый процесс Apache будет также висеть, отдавая контент клиенту (если не уходить от Apache совсем)? Можно же тупо перенаправлять запросы клиента (включая заголовки для докачки) и ответ пересылать.
Насчет простого примера - это вряд ли сейчас найду, а непростой есть - http://sourceforge.net/projects/poxy/files/PHProxy/0.5%20beta%202/poxy-0.5b2.zip/download
В файле index.php с 524 строки - это отправка запроса, а с 843 - это по сути отдача скачанного контента.
Если способ не держать процесс апача в памяти на протяжении всего скачивания файла? Например скачивать файлик со скоростью большей чем у юзера, складывать его в какой-нибудь буфер на диске, и уже оттуда продолжить отдачу.
сысоев говорит что именно для решения этой задачи он и стал разрабатывать nginx