Мы только что занялись аналогичной проблемой на моем месте работы. Надеюсь, вы сможете получить некоторое представление о нашем решении:
У нас была устаревшая структура, которая вызывала проблемы, система медленно, но верно ползла к остановке, и мы не могли понять, почему. После некоторого копания мы обнаружили, что проблема заключается в числовых файлах, которые мы имели в одном каталоге. Мы поняли, что исходная база кода помещала все палец и оригинальные изображения в одну и ту же папку, и мы достигли 68347 файлов! Это была определенная проблема. Мы также поняли, что сервер может замедляться, если несколько пользователей загружают изображения, а затем сервер обрабатывает загрузку, а также масштабирование и обрезку изображения.
Мы внедрили новое решение, которое мы считаем достаточно прочным для любых будущих проблем, с которыми мы сталкиваемся. Он сводится к трем пунктам: - структура каталогов с временными метками для изображений (решение структуры каталогов реализуется с использованием шаблона стратегии, поэтому мы можем легко создать новую стратегию, если у нас возникнут какие-либо проблемы) - обрабатывать только загрузку во время загрузки - управление большим пальцем управляется, когда изображение запрашивается в таком размере (это происходит только один раз и всякий раз, когда изображение просматривается впервые) - Мы перешли в библиотеку Imagine для обработки процесса обрезки и масштабирования поскольку мы обнаружили, что он дал лучшие результаты, чем ImageMagik и GD с точки зрения качества изображения. Check it out on Git.
Вот уровень детализации вокруг решения: 1. Для каждого типа загрузки (логотип, пользовательский аватар, документ и т.д.) мы имели бы базовый каталог например /.../uploads/logos/
Мы создали бы новую папку для каждого нового дня, что файл был загружен, например, /.../uploads/20122011/
В этих файлах, которые мы бы bucketed структуру папок, где не более 1000 файлов не будут найдены в каждой папке, например, /.../uploads/20122011/0/
, /.../uploads/20122011/1000/
и т.д.
Каждое изображение, которое было загружено мы генерировать псевдо уникальное имя (длиной 32 символов), мы использовали md5 времени + случайное семя, чтобы произвести это.
Во время загрузки, если изображение заменяло другое, мы обновили соответствующие строки в базе данных и затем удалили потерянный файл из db.
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, которые были изображениями для нашего большого пальца ногтя. Были ли обработаны любые приемлемые запросы и были бы созданы новые эскизы.
Большое вам спасибо за этот ответ! Несколько вопросов. 1. Почему вы не масштабируете изображения во время загрузки (я использую 5 размеров)? Я использую Amazon S3, что что-то меняет для структуры папок? –
@Jonathan - Вы выполняете 5 операций последовательно для каждого загружаемого изображения. Это может потребоваться накладные расходы, однако мы предположили, что не все изображения просматриваются во всех форматах, и определенно не сразу, чтобы оправдать всю эту предварительную обработку. Поэтому мы решили минимизировать накладные расходы во время загрузки и перенести обработку этого действия на первый запрос. Он также сохраняет пространство на сервере, когда вы начинаете думать о сотнях тысяч изображений, которые никогда не могут быть запрошены. С reagrds к S3, я не думаю, что это так. Хойвер не цитирую меня! – GordyD
Хорошо, я вижу, что вы указываете. API, который я разрабатываю, возможно, будет служить iOS-приложению (например, Instagram), а затем изображения будут «видны» непосредственно после завершения загрузки. Есть ли способ сохранить размер изображения на отдельной «нитке», так сказать? –