На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Serafim, fatalist
  
    > [PHP] Ограничение скорости скачивания файлов. , сабж
      Здравствуйте уважаемые форумчане.

      Задача: необходимо ограничить скорость скачивания файлов, незарегистрированным пользователям до 10 КБайт/сек.
      Моё видение решения: Считываем файл по 10 КБайт и отдаём flush(), при этом после каждой «отдачи» (10 КБ) засыпаем на 1 секунду.

      Возникают вопросы: Так ли это? Будет-ли такое решение рациональным или лучше пойти другим решением? Может в php есть какие-нибудь предустановленные средства для организации подобной задачи?

      Заранее блгодарен за советы.
      С уважением.
        у Апача есть готовые средства для тротлинга, но при отдаче больших файлов возникнет проблема: ПХП быстренько отрабатывает, а модуль должен буферизовать вывод (читай жрать ОЗУ, аки дурной)
        Так что ИМХО лучше это делать на ПХП.

        Добавлено
        т.е. я считаю тебя правым =)

        Добавлено
        кста, через "тики", можно организовать ваще очень красивую систему тротлинга:
        каждые Н-тиков вызывается наша функция, которая смотрит в ob: в подходящий момент сливает его клиенту, а в нужные "придерживает коней" слипом. =)
          Опять же предлагаю свой любимый вариант с nginx. Берем папку с файлами, делаем для нее алиас. При совпадении с алиасом ставим правило и лимитируем скорость. Зареганым отдаем по основному урлу. Не зареганные работают через алиас папки. Маскеруется внутренними редиректами.

          Добавлено
          Насколько мне известно о типах данных PHP, тебе не удасться отдать контент длинее 2гб.

          Добавлено
          В следствии "короткости" long'а
            Цитата Pr0[)!9Y @
            Зареганым отдаем по основному урлу. Не зареганные работают через алиас папки.
            как вариант — хорошо, но в этом случае могно будет обмануть систему подменив адрес папки.

            Цитата Pr0[)!9Y @
            Насколько мне известно о типах данных PHP, тебе не удасться отдать контент длинее 2гб.
            В следствии "короткости" long'а
            Отпадает, т.к. файл в переменную можно считывать, скажем, по 10 КБайт. И при этом в переменной держать только по 10 КБайт — следующим куском заменять предыдущий…
            Сообщение отредактировано: Программер -
              Цитата Программер @
              Отпадает, т.к. файл в переменную можно считывать, скажем, по 10 КБайт. И при этом в переменной держать только по 10 КБайт — следующим куском заменять предыдущий…

              Нет, нет, я не о том. Захочишь ты докачку например. Тебе смещение хранить нужно в числе.

              Цитата Программер @
              ак вариант — хорошо, но в этом случае могно будет обмануть систему подменив адрес папки.

              Цитата Pr0[)!9Y @
              Маскеруется внутренними редиректами.
                Цитата Pr0[)!9Y @
                Маскеруется внутренними редиректами.

                Редиректами? Ну, согласись, что я и ты, допустим, «плевать» хотели на такого рода маскировку. А именно такие как мы и будут основными «скачивателями».

                Цитата Pr0[)!9Y @
                Нет, нет, я не о том. Захочишь ты докачку например. Тебе смещение хранить нужно в числе.

                Не понял.
                Сообщение отредактировано: Программер -
                  Цитата Программер
                  Редиректами? Ну, согласись, что я и ты, допустим, «плевать» хотели на такого рода маскировку. А именно такие как мы и будут основными «скачивателями».

                  внутренними редиректами... (internal redirect ─ internal url rewriting)

                  Цитата Программер
                  Не понял.

                  При докачках ─ тебе придет хедер "range: 2100000000", чтобы адресовать нужный кусок файла, тебе надо привести это число к Инту и передать функции lseek.
                    Romko, спасибо, как нельзя точно описал ситуацию.
                      Romko и Pr0[)!9Y у меня есть вполне рабочий пример с докачкой.
                      Сообщение отредактировано: Программер -
                        Кто-то разве говорил что невозможно? Это неправильно просто =) Не хорошо так делать.
                        + попробуй отдать файл весом более 2гб =) Получишь кучу жалоб и недовольств =)
                          Цитата Pr0[)!9Y @
                          Это неправильно просто =) Не хорошо так делать.

                          Почему неправильно-то?

                          Цитата Pr0[)!9Y @
                          + попробуй отдать файл весом более 2гб =)

                          Сделал файл 2,57 Гб — он вообще не скачивается. С чем это связано?

                          Добавлено
                          Pr0[)!9Y, т.е., как я понимаю, это из-за того, что переменная $_SERVER['HTTP_RANGE'] несможет хранить необходимое число?
                            Цитата Программер @
                            Pr0[)!9Y, т.е., как я понимаю, это из-за того, что переменная $_SERVER['HTTP_RANGE'] несможет хранить необходимое число?
                            Именно так.

                            Цитата Программер @
                            Почему неправильно-то?
                            Потому что для этого есть специальные низкоуровневые средства, которы не расходуют память на ненужные в данный момент модули например. Использует более быстрые функции и способы. Просто веб-сервер и создан для отдачи контента, в данном случае файла и ты его не переплюнешь на уровне пхп. Дело вкуса и религии на самом деле, но имхо каждая часть должна заниматься своим делом.
                              Цитата Pr0[)!9Y @
                              Именно так.

                              Есть какие-либо варианты обхода этого ограничения?
                                Цитата Программер @
                                Есть какие-либо варианты обхода этого ограничения?

                                Не могу точно сказать. Но мне необходимо было получать верный размер файла в байтах, я использовал системную функцию получения размера файла, результат мне естественно приходил в виде стринги и ничего не портилось. Но если ты собрался делать математические опрации внутри пхп, то уже не прокатит. Думай в эту сторону, чтобы обработка больших чисел шла вне пхп.
                                  Цитата Pr0[)!9Y @
                                  Но если ты собрался делать математические опрации внутри пхп, то уже не прокатит. Думай в эту сторону, чтобы обработка больших чисел шла вне пхп.

                                  Всё решилось довольно просто. Оказалось достаточным предварительное определение типов переменных, т.е. назначить переменной тип double вместо integer-а который используется по умолчанию.

                                  Итог: Для отдачи фалов использую PHP.

                                  Всем спасибо и заветные «+».
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0427 ]   [ 15 queries used ]   [ Generated: 3.05.24, 02:29 GMT ]