Fineuploader перезапускает загрузку в случае задержки ответа сервера

Столкнулся с очень странной проблемой и ищу направление.

Контекст: загрузка больших файлов (до 100 МБ) в WordPress. В рамках процесса также выполняется длительная задача на стороне сервера (передача файла в DropBox через их API с использованием фрагментации), поэтому ответ неизбежно задерживается для больших файлов. Эту часть можно легко смоделировать, выполнив функцию PHP sleep().

Проблема: Fineuploader достигает 100 %, показывает сообщение waitingForResponse в течение примерно 15 секунд (на данный момент сервер еще не завершил обработку), а затем продолжает перезапускать загрузку с нуля. После второй попытки он утверждает, что ничего не получил от сервера, и указывает, что загрузка не удалась. Отладочные сообщения консоли:

[FineUploader] xhr - server response received for 0
XMLHttpRequest { readyState=4, timeout=0, withCredentials=false, more...}
[FineUploader] responseText = 

Журналы сервера показывают два запроса, и сервер дважды повторяет успешное выполнение в формате JSON; в итоге на сервере есть два файла.

Вопрос. Что я могу сделать, чтобы решить эту проблему? Могу ли я регулярно возвращать что-либо в FineUploader, чтобы не было тайм-аута?


person montrealist    schedule 19.05.2013    source источник


Ответы (1)


Fine Uploader не имеет механизма тайм-аута. Если вы видите тайм-аут, либо сам браузер принудительно устанавливает тайм-аут, либо какое-то устройство между браузером и вашим сервером истекает.

Я сталкивался с этой проблемой в прошлом при использовании AWS (Amazon Web Services). Как и в вашей ситуации, мне пришлось выполнить некоторую обработку на стороне сервера после того, как весь файл был получен, прежде чем возвращать ответ. Во время этой обработки, разумеется, TCP-трафика не было. Оказалось, что у ELB (Elastic Load Balancer) тайм-аут простоя TCP составляет 1 минуту. Обработка больших файлов превысила это значение, что привело к прекращению запроса ELB.

Вы можете вернуть ответ Fine Uploader только после того, как сделаете запрос/загрузку. Если вы действительно хотите дождаться ответа «успех» на Fine Uploader, пока обработка на стороне сервера не будет завершена, вам нужно выяснить, что прерывает ваш запрос. Ваши варианты, вероятно, либо увеличат период ожидания на устройстве, которое завершает ваш запрос, либо просто делегируют обработку отдельному потоку на стороне сервера и вернут ответ об успешном завершении, как только все байты файла будут получены и находятся в заказ.

person Ray Nicholus    schedule 19.05.2013
comment
да. В случае AWS вы можете запросить увеличение тайм-аута простоя TCP ELB. Это не то, что вы можете изменить самостоятельно, поэтому вы должны попросить администратора AWS сделать это за вас. Я не принимал непосредственного участия в обработке этого запроса (это задание было поручено кому-то другому из моей команды), но я считаю, что мы запросили увеличение, и оно было удовлетворено. Прежде чем запросить увеличение, мы обсудили простое делегирование обработки в отдельный поток и возвращение ответа как можно скорее. Если мне не изменяет память, было определено, что обработка должна происходить inline. - person Ray Nicholus; 19.05.2013
comment
Понимаю. Есть идеи, почему загрузка перезапускается? Это предполагаемая функциональность? - person montrealist; 19.05.2013
comment
Это может быть либо функция автоматического повтора загрузки (если она включена). Если с загрузчиком все в порядке, рядом с файлом на короткое время появится сообщение о состоянии повторной попытки. Вы видите что-нибудь подобное? - person Ray Nicholus; 19.05.2013
comment
Нет, не совсем. Зависает на 99% и перезагружается. Скорее всего, сервер закрывает соединение. Я просто озадачен тем, почему это происходит не сразу (или через более длительный период), а фактически перезапускает загрузку и завершает ее. - person montrealist; 21.05.2013
comment
У вас включена функция повтора? Очевидно ли из пользовательского интерфейса, что Fine Uploader заказывает повторную попытку? Какие сообщения журнала вы видите (с установленным параметром debug: true)? - person Ray Nicholus; 21.05.2013
comment
В конце концов оказалось, что это настройка тайм-аута Apache (которую хост отказался изменять). Урок, который следует усвоить, — всегда выбирать хост с умом. Еще раз, спасибо. - person montrealist; 24.05.2013
comment
@dalbaeb Рад, что вы решили эту проблему, и я смог чем-то помочь. Удачной загрузки! - person Ray Nicholus; 24.05.2013