Мы только что решили аналогичную проблему на моем рабочем месте.Я надеюсь, что вы можете получить некоторое представление о нашем решении:
У нас была устаревшая структура, которая вызывала проблемы, система медленно, но верно падала, и мы не могли понять, почему.После нескольких копаний мы обнаружили, что проблема заключается в количестве файлов, которые у нас были в одном каталоге.Мы поняли, что исходная кодовая база помещает все оригинальные изображения в одну папку, и мы получили 68347 файлов!Это была определенная проблема.Мы также поняли, что сервер может замедляться, если несколько пользователей загружают изображения, а затем сервер обрабатывает загрузку, а также масштабирование и обрезку изображения.
Мы внедрили новое решение сейчас, которое, по нашему мнению, является достаточно надежным для любых будущих задач, с которыми мы сталкиваемся.Он сводится к трем пунктам: - структура папок с изображениями с метками времени и метками (решение о структуре каталогов реализуется с использованием шаблона стратегии, поэтому мы можем легко создать новую стратегию, если возникнут какие-либо проблемы) - обрабатывать загрузку только привремя загрузки - управление большим пальцем выполняется, когда изображение запрашивается в этом размере (это происходит только один раз и при первом просмотре изображения) - мы перешли в библиотеку Imagine, чтобы обработать процесс обрезки и масштабирования, как мы его нашлидал лучшие результаты, чем ImageMagik и GD с точки зрения качества изображения. Проверьте это в Git.
Ниже приведен уровень детализации решения: 1. Для каждого типа загрузки (логотип, аватар пользователя, документ и т. Д.).) у нас будет базовый каталог например, /.../uploads/logos/
Мы будем создавать новую папку для каждого нового дня, когда был загружен файл, например /.../uploads/20122011/
В этих файлах мы будем иметь структуру папок с пакетами , в которой в каждой папке будет найдено не более 1000 файлов, например, /.../uploads/20122011/0/
, /.../uploads/20122011/1000/
и т. Д.
Каждое загруженное изображение будет генерировать псевдо уникальное имя (длиной 32 символа), мы использовали md5 времени + случайное начальное число для генерации этого.
Во время загрузки, если изображение заменяет другое, мы обновим соответствующие строки в базе данных, а затем удалим осиротевший файл из БД.
Миниатюра изображения будет обработана при первом запросе .Мы реализовали это, используя следующие правила в нашем файле 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]
Это перенаправит любые запросы на файлыэтого не было, это были изображения для нашего большого пальца.В случае обработки любых приемлемых запросов и создания новых миниатюр.