Почему apache не обрабатывает несколько запросов из одного браузера одновременно

Я не совсем уверен, как правильно сформулировать этот вопрос, поэтому я начну со сценария, с которым столкнулся.

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

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

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

однако мне все еще любопытно, знает ли кто-нибудь, почему apache ведет себя таким образом, и какая (если есть) директива конфигурации контролирует его. Моя первоначальная мысль была KeepAlive, но отключение этого, похоже, не изменило поведение.

Я запускаю php через mod_php, если это имеет значение.

I признателен за любую помощь в правильном направлении!

3 ответов


используете ли вы сеансы на основе файлов? PHP будет блокировать файлы сеанса для каждого запроса и поддерживать эту блокировку, пока вы не сделаете session_write_close() или скрипт завершает/завершает работу. Побочным эффектом этого является то, что все запросы становятся последовательными, поскольку все они борются за один и тот же ресурс (файл сеанса).


Я уверен, что это файл сессии. У меня та же проблема. Я запускаю запрос, который длинный, такой как вставка SQL PHPMyAdmin, которая занимает несколько минут для обработки. Во время его обработки я пытаюсь открыть новую вкладку в том же браузере и перейти на любую страницу на моем сайте, и она не будет идти туда, пока не будет выполнен исходный запрос PHPMyAdmin. Если я открою окно инкогнито в Chrome, который является тем же браузером, он отлично работает. Если я открываю сайт в любом другом браузере, это нормально. Так что это, вероятно, сеанс на основе файлов, который используется по умолчанию для PHP.

надо идти к memcached. Можно также сохранять сеансы в базе данных. Прежде чем перейти к memcached, вы можете сделать все сеансовые вещи в начале. Скопируйте переменную сеанса во временную переменную, чтобы ее можно было закрыть, а затем закрыть. А затем, если вам нужно установить значение сеанса позже, откройте его и внесите изменения, а затем быстро закройте.


можете ли вы указать на доказательства того, что это apache? Если ваша настройка apache не является оптимальной, скорее всего, ожидание страницы-это что-то другое, возможно, вы установили вызов ajax на non-async?