Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.117.153.38] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте уважаемые форумчане.
Задача: необходимо ограничить скорость скачивания файлов, незарегистрированным пользователям до 10 КБайт/сек. Моё видение решения: Считываем файл по 10 КБайт и отдаём flush(), при этом после каждой «отдачи» (10 КБ) засыпаем на 1 секунду. Возникают вопросы: Так ли это? Будет-ли такое решение рациональным или лучше пойти другим решением? Может в php есть какие-нибудь предустановленные средства для организации подобной задачи? Заранее блгодарен за советы. С уважением. |
Сообщ.
#2
,
|
|
|
у Апача есть готовые средства для тротлинга, но при отдаче больших файлов возникнет проблема: ПХП быстренько отрабатывает, а модуль должен буферизовать вывод (читай жрать ОЗУ, аки дурной)
Так что ИМХО лучше это делать на ПХП. Добавлено т.е. я считаю тебя правым =) Добавлено кста, через "тики", можно организовать ваще очень красивую систему тротлинга: каждые Н-тиков вызывается наша функция, которая смотрит в ob: в подходящий момент сливает его клиенту, а в нужные "придерживает коней" слипом. =) |
Сообщ.
#3
,
|
|
|
Опять же предлагаю свой любимый вариант с nginx. Берем папку с файлами, делаем для нее алиас. При совпадении с алиасом ставим правило и лимитируем скорость. Зареганым отдаем по основному урлу. Не зареганные работают через алиас папки. Маскеруется внутренними редиректами.
Добавлено Насколько мне известно о типах данных PHP, тебе не удасться отдать контент длинее 2гб. Добавлено В следствии "короткости" long'а |
Сообщ.
#4
,
|
|
|
Цитата Pr0[)!9Y @ как вариант — хорошо, но в этом случае могно будет обмануть систему подменив адрес папки.Зареганым отдаем по основному урлу. Не зареганные работают через алиас папки. Цитата Pr0[)!9Y @ Отпадает, т.к. файл в переменную можно считывать, скажем, по 10 КБайт. И при этом в переменной держать только по 10 КБайт — следующим куском заменять предыдущий… Насколько мне известно о типах данных PHP, тебе не удасться отдать контент длинее 2гб. В следствии "короткости" long'а |
Сообщ.
#5
,
|
|
|
Цитата Программер @ Отпадает, т.к. файл в переменную можно считывать, скажем, по 10 КБайт. И при этом в переменной держать только по 10 КБайт — следующим куском заменять предыдущий… Нет, нет, я не о том. Захочишь ты докачку например. Тебе смещение хранить нужно в числе. Цитата Программер @ ак вариант — хорошо, но в этом случае могно будет обмануть систему подменив адрес папки. Цитата Pr0[)!9Y @ Маскеруется внутренними редиректами. |
Сообщ.
#6
,
|
|
|
Цитата Pr0[)!9Y @ Маскеруется внутренними редиректами. Редиректами? Ну, согласись, что я и ты, допустим, «плевать» хотели на такого рода маскировку. А именно такие как мы и будут основными «скачивателями». Цитата Pr0[)!9Y @ Нет, нет, я не о том. Захочишь ты докачку например. Тебе смещение хранить нужно в числе. Не понял. |
Сообщ.
#7
,
|
|
|
Цитата Программер Редиректами? Ну, согласись, что я и ты, допустим, «плевать» хотели на такого рода маскировку. А именно такие как мы и будут основными «скачивателями». внутренними редиректами... (internal redirect ─ internal url rewriting) Цитата Программер Не понял. При докачках ─ тебе придет хедер "range: 2100000000", чтобы адресовать нужный кусок файла, тебе надо привести это число к Инту и передать функции lseek. |
Сообщ.
#8
,
|
|
|
Romko, спасибо, как нельзя точно описал ситуацию.
|
Сообщ.
#9
,
|
|
|
Romko и Pr0[)!9Y у меня есть вполне рабочий пример с докачкой.
|
Сообщ.
#10
,
|
|
|
Кто-то разве говорил что невозможно? Это неправильно просто =) Не хорошо так делать.
+ попробуй отдать файл весом более 2гб =) Получишь кучу жалоб и недовольств =) |
Сообщ.
#11
,
|
|
|
Цитата Pr0[)!9Y @ Это неправильно просто =) Не хорошо так делать. Почему неправильно-то? Цитата Pr0[)!9Y @ + попробуй отдать файл весом более 2гб =) Сделал файл 2,57 Гб — он вообще не скачивается. С чем это связано? Добавлено Pr0[)!9Y, т.е., как я понимаю, это из-за того, что переменная $_SERVER['HTTP_RANGE'] несможет хранить необходимое число? |
Сообщ.
#12
,
|
|
|
Цитата Программер @ Именно так.Pr0[)!9Y, т.е., как я понимаю, это из-за того, что переменная $_SERVER['HTTP_RANGE'] несможет хранить необходимое число? Цитата Программер @ Потому что для этого есть специальные низкоуровневые средства, которы не расходуют память на ненужные в данный момент модули например. Использует более быстрые функции и способы. Просто веб-сервер и создан для отдачи контента, в данном случае файла и ты его не переплюнешь на уровне пхп. Дело вкуса и религии на самом деле, но имхо каждая часть должна заниматься своим делом. Почему неправильно-то? |
Сообщ.
#13
,
|
|
|
Цитата Pr0[)!9Y @ Именно так. Есть какие-либо варианты обхода этого ограничения? |
Сообщ.
#14
,
|
|
|
Цитата Программер @ Есть какие-либо варианты обхода этого ограничения? Не могу точно сказать. Но мне необходимо было получать верный размер файла в байтах, я использовал системную функцию получения размера файла, результат мне естественно приходил в виде стринги и ничего не портилось. Но если ты собрался делать математические опрации внутри пхп, то уже не прокатит. Думай в эту сторону, чтобы обработка больших чисел шла вне пхп. |
Сообщ.
#15
,
|
|
|
Цитата Pr0[)!9Y @ Но если ты собрался делать математические опрации внутри пхп, то уже не прокатит. Думай в эту сторону, чтобы обработка больших чисел шла вне пхп. Всё решилось довольно просто. Оказалось достаточным предварительное определение типов переменных, т.е. назначить переменной тип double вместо integer-а который используется по умолчанию. Итог: Для отдачи фалов использую PHP. Всем спасибо и заветные «+». |