Сервер выполняет прерванный запрос Ajax, пока он не завершится

Недавно я искал способ реализации некоторых разблокирующих запросов Ajax. Я нашел много ответов, включая это и это, которое удовлетворило мои потребности. После реализации более позднего решения я попытался отправить запрос Ajax, а затем вызвать другой, чтобы первый прервался (поэтому пользователь не ждет), а второй запустился.

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

Чтобы сделать его более читабельным, предположим, что "запрос1" выполняется 10 секунд, а "запрос2" — 5 секунд. >. Теперь, если я прерву "request1" через 5 секунд, тогда "request2" займет приблизительно 10 секунд (5 секунд от "request1 " и 5 из "request2") для выполнения.

Я отслеживаю выполнение сервера Apache, и мое первое предположение состоит в том, что когда запрос отправляется на сервер, независимо от того, прерываем мы его или нет на стороне клиента, ресурсы сервера будут потребляться, и единственное, что происходит, это то, что клиент не ожидайте результата, потому что запросчик (request1 в моем примере) прерван.

Теперь мой вопрос: если мое предположение верно, есть ли способ сообщить серверу, чтобы остановить текущий процесс и запустить следующий (на этот вопрос нет ответа)?

Или, если у нашего сервера больше вычислительной мощности, как мы можем разрешить выполнение новых запросов другим процессором?

вот мой код для дальнейшего исследования:

//Ajax Request Queue
var ajaxQueue = [];

ajaxQueue.push(//Push in Ajax Queue
                $.ajax({
                type: 'POST',
                cache: false,
                url: url,
                data: {'token': $.cookie('s3_ctoken')},
                dataType: 'html',
                beforeSend: function (xhr, setting) {

                },
                success: function (res, textStatus, xhr) {

                },
                error: function (xhr, textStatus, thrownError) {

                },
                complete: function () {

                },
                async: true
            })
            );

//On next ajax request
if(ajaxQueue.length > 0){//Means there is some ajax requests are running
 for(var i = 0; i < ajaxQueue.length; i++)
  ajaxQueue[i].abort();
}

person sobhan    schedule 29.04.2014    source источник
comment
Это может вам помочь: stackoverflow.com/questions /2043594/   -  person arkascha    schedule 29.04.2014
comment
@arkascha Это именно моя проблема (а не решение). Здесь я хочу, чтобы сервер прекратил выполнение скрипта, не выполнял его и после этого решал, отправлять или не отправлять мне результат. На основании руководства PHP не обнаружит, что пользователь прервал соединение, пока не будет предпринята попытка отправить информацию клиенту. Это означает, что он будет выполняться до конца, и после этого он решит не возвращать результат. Я правильно понял?   -  person sobhan    schedule 29.04.2014
comment
Вы правы, и это также ваше решение: просто отправьте один пробел (что ничего не сломает) и сбросьте буфер вывода. Это должно помочь, если это действительно проблема, с которой вы столкнулись.   -  person arkascha    schedule 29.04.2014
comment
@arkascha, отправляя «пробел», вы имеете в виду отправку еще одного запроса ajax на сервер с данными: ' '? Если это так, как я уже говорил ранее, мой сервер перестает отвечать (ничего не обрабатывает) до тех пор, пока предыдущий процесс не завершится. Поэтому, пожалуйста, уточните свое решение немного больше. заранее спасибо :)   -  person sobhan    schedule 29.04.2014
comment
Нет, отправив ' ' с сервера клиенту. На обычной базе. Затем сценарий на стороне сервера может определить, что он должен прерваться.   -  person arkascha    schedule 29.04.2014
comment
@arkascha Получил, проверю и сообщу   -  person sobhan    schedule 29.04.2014
comment
@arkascha Я проверил это, даже используя flush() и ob_flush() после echo ' ', проблема все еще сохраняется, и команда выполняется до конца   -  person sobhan    schedule 30.04.2014
comment
Хм, а может быть где-то установлен флаг ignore_user_abort?   -  person arkascha    schedule 30.04.2014
comment
@arkascha На самом деле я проверил это на echo ignore_user_abort(), и результат 0, поэтому я могу сказать, что он выключен и не установлен.   -  person sobhan    schedule 30.04.2014
comment
Странный. Может быть, вы используете php как cgi, а не как модуль, как это обычно бывает сегодня? Извините, пытаюсь догадаться сам, так как понятия не имею, что происходит...   -  person arkascha    schedule 30.04.2014
comment
@arkascha Я запускаю его на apache, это CGI?   -  person sobhan    schedule 01.05.2014
comment
Apache как http-сервер может интегрировать php по-разному: как модуль, как cgi, как fast-cgi. Все эти альтернативы имеют свои плюсы и минусы, но обычно в наши дни php используется как модуль. Что означает: apache загружает библиотеку, а php выполняется внутри дочерних процессов apache. cgi наоборот порождает отдельный процесс, выделенный интерпретатор php для каждого отдельного запроса. Эта стратегия несколько устарела, поскольку неэффективна. Я упомянул об этом только потому, что в таких случаях очевидно, что связь между apache и php будет проходить через границы процесса, что намного сложнее.   -  person arkascha    schedule 01.05.2014
comment
@arkascha спасибо за ваше подробное описание, и я могу с уверенностью сказать, что он работает как модуль в процессе apache.   -  person sobhan    schedule 01.05.2014
comment
Читая немного о комментариях к методу abort() для ajax-запросов, у меня сложилось впечатление, что действительно клиент не ждет результатов запроса, но на самом деле он не отменяет запрос. Я могу ошибаться в этом, вам придется исследовать это дальше. Но если это так, то проблема здесь не на стороне сервера/php, а внутри ajax. Вопрос: действительно ли сокет закрыт, потому что тогда php может на это отреагировать? Пока не уверен, как это проверить...   -  person arkascha    schedule 01.05.2014