Загрузка изображений для тысяч пользователей - PullRequest
1 голос
/ 20 декабря 2011

Я занимаюсь разработкой API с использованием Codeigniter.В этом API я хочу позволить людям загружать изображения в свои учетные записи.Затем эти изображения создаются в виде миниатюр и оригиналов.

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

Хорошо ли будут работать используемые мной ванильные библиотеки?Предполагая, что мой код хорош, или мне нужно использовать другие способы обработки загрузок и манипуляций с изображениями.Есть предложения?

Возможно, все зависит от настроек сервера?

1 Ответ

3 голосов
/ 20 декабря 2011

Мы только что решили аналогичную проблему на моем рабочем месте.Я надеюсь, что вы можете получить некоторое представление о нашем решении:

У нас была устаревшая структура, которая вызывала проблемы, система медленно, но верно падала, и мы не могли понять, почему.После нескольких копаний мы обнаружили, что проблема заключается в количестве файлов, которые у нас были в одном каталоге.Мы поняли, что исходная кодовая база помещает все оригинальные изображения в одну папку, и мы получили 68347 файлов!Это была определенная проблема.Мы также поняли, что сервер может замедляться, если несколько пользователей загружают изображения, а затем сервер обрабатывает загрузку, а также масштабирование и обрезку изображения.

Мы внедрили новое решение сейчас, которое, по нашему мнению, является достаточно надежным для любых будущих задач, с которыми мы сталкиваемся.Он сводится к трем пунктам: - структура папок с изображениями с метками времени и метками (решение о структуре каталогов реализуется с использованием шаблона стратегии, поэтому мы можем легко создать новую стратегию, если возникнут какие-либо проблемы) - обрабатывать загрузку только привремя загрузки - управление большим пальцем выполняется, когда изображение запрашивается в этом размере (это происходит только один раз и при первом просмотре изображения) - мы перешли в библиотеку Imagine, чтобы обработать процесс обрезки и масштабирования, как мы его нашлидал лучшие результаты, чем ImageMagik и GD с точки зрения качества изображения. Проверьте это в Git.

Ниже приведен уровень детализации решения: 1. Для каждого типа загрузки (логотип, аватар пользователя, документ и т. Д.).) у нас будет базовый каталог например, /.../uploads/logos/

  1. Мы будем создавать новую папку для каждого нового дня, когда был загружен файл, например /.../uploads/20122011/

  2. В этих файлах мы будем иметь структуру папок с пакетами , в которой в каждой папке будет найдено не более 1000 файлов, например, /.../uploads/20122011/0/, /.../uploads/20122011/1000/ и т. Д.

  3. Каждое загруженное изображение будет генерировать псевдо уникальное имя (длиной 32 символа), мы использовали md5 времени + случайное начальное число для генерации этого.

  4. Во время загрузки, если изображение заменяет другое, мы обновим соответствующие строки в базе данных, а затем удалим осиротевший файл из БД.

  5. Миниатюра изображения будет обработана при первом запросе .Мы реализовали это, используя следующие правила в нашем файле http conf:

    AllowOverride all Order Deny, Allow Allow from all

        RewriteEngine On
        RewriteCond %{HTTP_HOST} ^static\.(.*)$
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} ^(.+)\.(jpg|jpeg|png|gif)$
        RewriteRule ^.*$ /path/to/public/thumbnailer.php [NC,L]
    

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...