Лучше ли изменить размер изображения по требованию или при загрузке?
Я работаю над проектом, который требует использования пользовательских изображений разных размеров в разных разделах сайта. Изображения, которые нужно обслуживать, представляют собой миниатюры основных изображений различных размеров, таких как 35 x 35 пикселей, 50 x 50 пикселей и 100 x 100 пикселей. Я хочу разрешить пользователю загружать только одну картинку.
Я использую PHP и Apache в качестве веб-сервера. Первоначально сайт оценивается в 400 тыс. Посещений и может значительно возрасти. Мой вопрос:
Должен ли я изменить размер изображения до всех необходимых мне размеров, сохранив оригинал при загрузке? Или я должен изменить размер изображения только по требованию и отображать (используя что-то похожее на phpThumb)?
Пожалуйста, я хотел бы знать, какая из них лучше по производительности или скорости, а также по управлению ресурсами, учитывая уровень трафика, и на данный момент на сайте может быть до 100 одновременно работающих пользователей.
5 ответов
Диск дешев, а изменение размера по требованию очень дорого. Я никогда не буду изменять размер по запросу для каждого запроса. Я думаю, у вас есть два варианта:
- Создайте все разные размеры один раз при загрузке.
- Сохраняйте оригинал, изменяйте размер на лету при первом запросе определенного размера и кэшируйте его для будущих запросов.
Обновление: nginx имеет хороший модуль для изменения размера на лету. Я бы никогда не использовал его в производстве сам по себе, но если вы соедините его с обратным прокси-сервером, вы по существу получите второй вариант без необходимости писать какой-либо код.
Изменение размера один раз для загрузки является предпочтительным. Изменение размеров изображений на лету может потребовать значительных ресурсов памяти и процессора (в зависимости от количества посещений и размера изменяемых изображений). Кроме того, отображение изображений непосредственно с диска может быть заметно быстрее, чем изменение размера и последующее отображение по запросу. Если вы посмотрите на этот ответ здесь, вы увидите, что он выполнил тест на 1,3-мегапиксельном изображении, и это привело к довольно заметным 0,1 с:
$ /usr/bin/time --format="%MK mem %Es CPU time" /usr/bin/convert angry_birds_1280x800.jpg -resize 100x100 thumb.jpg
10324K mem 0:00.10s CPU time
Если у вас нет огромного количества размеров изображения для данного исходного изображения, всегда лучше создавать различные изображения только один раз и обрабатывать их по мере необходимости. Это не так много места на сервере, и вы сэкономите огромное количество ресурсов сервера и время ожидания пользователя.
Если вы обеспокоены тем, что конкретное изображение с заданным размером может быть запрошено только в редких случаях, рассматривайте хранилище изображений вашего сервера как кеш. Создавайте файл изображения с измененным размером только по требованию и сохраняйте его в своем хранилище для следующего запроса. Это также будет работать, если вы не хотите сжигать много циклов ЦП при загрузке целого набора изображений на сервер. Если у вас очень ограниченный хост и вам нужно следить за использованием диска, вы можете очистить файлы изображений с измененным размером после некоторого периода отсутствия запросов, сохраняя только наиболее часто запрашиваемые.
Насколько я знаю, безопасность здесь не обсуждается. Что касается производительности... это зависит от того, к чему вы стремитесь:
генерация изображений по запросу будет влиять на пользовательский опыт: когда ему это понадобится, ему нужно будет подождать, пока он будет изменен, а затем загружен. Но это хороший способ "распределить" использование ресурсов. Обратите внимание, что в этом случае вы захотите сделать это только один раз и сохранить ссылку на сгенерированный файл, чтобы вы могли использовать его для всех последующих запросов.
генерация изображений при загрузке будет использовать больше ресурсов в то время, когда пользователь загружает изображение, но тогда вы согласны с этим
Поэтому я бы не сказал, что одно решение лучше другого, но зависит от ожидаемого количества пользователей, имеющихся у вас ресурсов и желаемого опыта пользователя.
Одним из больших преимуществ решения "изменить размер при загрузке" является то, что если в какой-то момент у вас немного не хватает ресурсов (например, в случае одновременной регистрации большого количества пользователей), вы можете просто "задержать" (= очередь) операции по изменению размера в более спокойный период дня...
Однако в обоих случаях я бы точно оставил исходную версию, чтобы вы могли изменить ее размер в случае изменения сайта…
Это полностью зависит от вашего приложения и требований.
Преимущество масштабирования при загрузке заключается в том, что (а) вы используете меньше дискового пространства; и (б) вам не нужно беспокоиться об изменении размера / кэшировании изображения позже.
Тем не менее, существует множество случаев (размер по умолчанию, который вы хотите использовать, изменения, вы хотите иметь несколько разных размеров и т. Д. И т. Д.), Когда вы хотите сохранить исходную более крупную версию и изменить размер "по требованию". НО изменение размера требует очень много памяти / ЦП, поэтому, если вы пойдете по этому пути, вы почти наверняка должны построить кеш-систему, которая хранит версии изображения с измененным размером в кеш-файле и обрабатывает его только при отсутствии кешированной версии.