отдать ответ до ресайза

sunyang

Новичок
Заюзал jquery fileupload для ajax загрузки картинок.
При загрузке показывается progress bar - процент загрузки.
progress bar показывает именно процент загрузки изображения с компа на сервер.
Но так как на сервере еще происходит ресайз и создание 4-х картинок от исходной (imagemagick), время получается больше.
И получается такая ситуация - progress bar уже дошел до 100%, т.к. картинка загруженна на сервер, но ответ от сервера еще не пришел, так как все еще выполняется ресайз.

Получается расхождение - юзеру вроде бы показывается, что имага на 100% загруженна, а на самом деле - нет.

Кто-нибудь сталкивался с такиой проблемой? Как это можно решить?
 

AnrDaemon

Продвинутый новичок
Не надо ресайзить во время аплоада. И всё будет в порядке.
 

fixxxer

К.О.
Партнер клуба
А что мешает upload progress отображать, скажем, по шкале от 0 до 90%?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Ресайзить уже давно можно на клиенте.

PS: автор, в разделе БД не надо больше треды такие создавать)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
thumbnailы надо генерить при их запросе, а не сразу после аплоада
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
hell0w0rd, черт, а у нас все хорошо) Что-то делаем не так...
 

MiksIr

miksir@home:~$
thumbnailы надо генерить при их запросе, а не сразу после аплоада
Имхо вот зависит от инфраструктуры.

Если у вас процессора излишек, но дорогое HDD и при этом ровная нагрузка по всем картинкам (т.е. горячий кеш в пролете) - можно и при запросе. С риском получить внезапную загрузку процессора и время ожидания больше расчетного в случае аномальной нагрузки (пришло несколько поисковых ботов и пошло по картинкам). А потери по диску мизерные весьма, сколько там процентов превьюшка от большой картинки...

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

grigori

( ͡° ͜ʖ ͡°)
Команда форума
здесь выбор из 3х зол:
* если одновременно десяток юзеров решит залить большие фотки - генерация в скрипте, который обрабатывает загрузку, чревата выпадением в своп, значит, нельзя использовать удобные виджеты, которыми можно заливать кучу фоток одновременно
* генерация в фоновом процессе плоха недоступностью сразу после загрузки и сложностями распараллеливания демона
* пик при обращении решается отдельным маленьким пулом fpm и очередью запросов в nginx - да, на пике первый раз немного подождут, это лучше, чем несколько загрузок отвалится
 
Последнее редактирование:

MiksIr

miksir@home:~$
Это в случае, если фото генерируется за "подождут немного". Если у нас пик (что более вероятно, чем пришедшие пользователи на заливку, ибо боты), то это время может быть слишком велико, в итоге не дождется, а ресурсы скушает, забьет воркеры и все последующие фото тоже на отлуп (ибо не успевает генериться).

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

А в чем проблема с параллелить? Банальная очередь. Т.е. технически решение посложнее, чем тупо nginx по 404 пробросить на ресайз, но зато более управляемо.

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

И, к слову, если пользователь видит превью сразу после загрузки и генерация по запросу - в итоге и получили генерацию по загрузке, только не управляемую, вот тогда пачка пользователей и создаст проблему.
 

fixxxer

К.О.
Партнер клуба
MiksIr, генерация при аплоаде не катит еще в одном случае - когда заранее не знаем, какие будут размеры нужны.
Только тут параметры ресайза надо прикрывать secure_link-ом или подобным, иначе легко сделать DoS.
 
Сверху