Как загрузить файлы через ajax без таймаутов - PullRequest
3 голосов
/ 04 мая 2019

Я использую ajax для загрузки группы из ~ 50 файлов, все <= 5 МБ.Если соединение идет медленнее, загрузка будет «прервана», даже не закончив первую загрузку (примерно через 45 секунд после загрузки). </p>

В Firefox ajax завершится ошибкой с ответом «ошибка», но нетдальнейшая информацияВ Chrome я получаю ошибку net :: ERR_CONNECTION_RESET.

Я проверил свои настройки Apache и php.ini, и я считаю, что их все достаточно.

post_max_size = 1000M
upload_max_filesize = 15M
max_input_time = -1
max_execution_time = 0
max_file_uploads = 50
memory_limit = 128M

У меня естьтакже попытался установить для параметра времени ожидания ajax значение 0. Мой запрос ajax выглядит примерно так:

return $.ajax({ 
    url: ajaxpath,
    type: 'post',
    data: formData,
    dataType: 'json',
    timeout: 0,
    xhr: function(){

        var myXhr = $.ajaxSettings.xhr();

        if(myXhr.upload) myXhr.upload.addEventListener('progress',function(e){

            uploadProgress(e,item);

        },false);

        return myXhr;

    },
    processData: false,
    contentType: false

}).fail(function(jqXHR,textStatus,errorThrown){

            console.log(textStatus,errorThrown);

        });

    }

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

Я что-то пропустил?Как я могу сохранить загрузку?

Ответы [ 3 ]

3 голосов
/ 07 мая 2019

Использование mod_reqtimeout Модуль Apache в итоге решил мою проблему:

RequestReadTimeout header = 20-40, MinRate = 500 body = 20, MinRate = 500

Я нашел это предложение в нижней части аналогичный вопрос .

Для справки я попытался изменить различные настройки ini, директиву Apache TimeOut, а также функцию php set_time_limit, но безуспешно.

0 голосов
/ 07 мая 2019

Ваша конфигурация кажется правильной.отсутствует только одна вещь - set_time_limit

set_time_limit(0); //If set to zero, no time limit is imposed. 

0 голосов
/ 07 мая 2019

Сначала ваш веб-сервер может иметь другие конфигурации тайм-аута, которые также могут прерывать выполнение PHP.

Apache имеет директиву Timeout, а IIS имеет функцию тайм-аута CGI.

Оба по умолчанию 300 секунд.

Смотрите подробности в документации к вашему веб-серверу.

это сообщение

ERR_CONNECTION_RESET

не приходит из скрипта php, это проблема сервера, потому что сервер отключается, ничего не отправляя клиенту!

вот что вы можете попробовать:

1 - измените настройку max_execution_time = 1000 и посмотрите, получите ли вы больше времени, у меня возникли проблемы со старыми версиями xammp и appserv при использовании max_execution_time = 0!

2 - в наборе php.ini:

upload_max_filesize = 300M

post_max_size = 300M

3 - вставьте это в ваш скрипт:

set_time_limit(3600); // 1 hour

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

...