2011-12-20 5 views
1

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

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

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

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

ответ

3

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

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

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

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

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

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

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

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

  5. thumbnailing изображения обрабатывается по первому запросу. Мы реализовали это, используя folllowing правила в нашем HTTP конф файл:

    AllowOverride все Order Deny, Allow Разрешить из всех

    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] 
    

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

+0

Большое вам спасибо за этот ответ! Несколько вопросов. 1. Почему вы не масштабируете изображения во время загрузки (я использую 5 размеров)? Я использую Amazon S3, что что-то меняет для структуры папок? –

+0

@Jonathan - Вы выполняете 5 операций последовательно для каждого загружаемого изображения. Это может потребоваться накладные расходы, однако мы предположили, что не все изображения просматриваются во всех форматах, и определенно не сразу, чтобы оправдать всю эту предварительную обработку. Поэтому мы решили минимизировать накладные расходы во время загрузки и перенести обработку этого действия на первый запрос. Он также сохраняет пространство на сервере, когда вы начинаете думать о сотнях тысяч изображений, которые никогда не могут быть запрошены. С reagrds к S3, я не думаю, что это так. Хойвер не цитирую меня! – GordyD

+0

Хорошо, я вижу, что вы указываете. API, который я разрабатываю, возможно, будет служить iOS-приложению (например, Instagram), а затем изображения будут «видны» непосредственно после завершения загрузки. Есть ли способ сохранить размер изображения на отдельной «нитке», так сказать? –

Смежные вопросы