2012-06-06 8 views
2

У меня есть эта странная проблема, когда иногда, если я делаю два запроса AJAX на сервер Apache 2.2 быстро, второй запрос будет ждать завершения первого завершения до завершения.Apache делает несколько запросов AJAX ведя синхронно

Пример: у меня есть два запроса: один, который спит в течение 10 секунд, и тот, который немедленно возвращается. Если я запустил запрос, который немедленно возвращается сам по себе, он всегда будет возвращаться в течение 300 мс. Однако, если я вызываю запрос, который занимает 10 секунд, а затем вызывает запрос, который возвращает сразу около 50% времени, когда второй запрос будет ждать, пока первый финиш, а хром сообщит, что запрос тоже за 10 секунд до получения ответ. В другой половине времени быстрый запрос вернется сразу.

Я не могу найти ни одного шаблона, чтобы заставить его вести себя так или иначе, он просто случайно блокирует быстрые запросы AJAX, а иногда он будет вести себя так, как ожидалось. Я работаю над dev-сервером, к которому только я обращаюсь, и установил несколько переменных, таких как MaxRequestsPerChild, на большое значение.

Кто-нибудь есть идеи, почему Apache, казалось бы, случайным образом превращает мои запросы AJAX в синхронные запросы?

Вот код, я бегу:

$.ajax({async:true,dataType:'json',url:'/progressTest',success:function(d){console.log('FINAL',d)}}); // Sleeps for 10 seconds 
$.ajax({async:true,dataType:'json',url:'/progressTestStatus',success:function(d){console.log('STATUS',d)}}); // Takes ~300ms 

И вот два снимки экрана. Первый, где он вел себя так, как ожидалось, и второй, где он ожидал, что медленный процесс завершится первым (в примере тайм-аут был установлен на 3 секунды).

Expected async behavior

Async behavior

UPDATE: Per комментарии ниже - это, как представляется, связано с Chrome только выполнение одного запроса в то время. Любые идеи, почему Chrome установит такой низкий предел для асинхронных запросов?

+0

Это может быть и Chrome (возможно, не Apache). Браузер может делать только столько запросов одновременно (хотя обычно это больше 2). Были ли загружены другие файлы, например, некоторые фоновые изображения? – Paulpro

+1

Возможно, вы видите конвейерную обработку (что будет делать браузер). Наблюдайте за сетевым трафиком, используя Wireshark. – derobert

+0

Chrome будет печатать "(ожидает ответа)" для каждого запроса, поскольку ожидает ответа от сервера. Но я буду экспериментировать с отметками времени, чтобы проверить, действительно ли запросы открываются одновременно. – Dan

ответ

1

Проблема не в Apache, а в Google Chrome, ограничивающей количество одновременных запросов на ваш сервер разработки. Я могу только догадываться, почему он ограничен одним запросом. Вот пара:

1) У вас открыто много вкладок? Ограничение на общее количество одновременных подключений ограничено, и если у вас много вкладок с запросами с KeepAlive, вы можете быть в этом лимите и можете установить только одно подключение к вашему серверу. Если это так, вы можете исправить это, добавив KeepAlive в свои собственные заголовки вывода.

2) У вас есть расширения. Некоторые расширения делают странные вещи в браузере. Попробуйте отключить все свои расширения и сделать те же запросы. Если он работает, включите их по одному, чтобы найти расширение виновника.

+0

Хром - это определенно проблема.Я закрыл все свои другие вкладки, и проблема стала лучше *, но полностью не исчезла (возможно, из-за расширения, которое все еще включено). Тем не менее, спасибо Пол за то, что помог мне определить причину. – Dan

Смежные вопросы