Почему apache не обрабатывает несколько запросов из одного браузера одновременно - PullRequest
7 голосов
/ 02 сентября 2010

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

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

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

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

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

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

Я ценю любую помощь, указанную вправильное направление!

Ответы [ 3 ]

12 голосов
/ 02 сентября 2010

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

2 голосов
/ 11 января 2013

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

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

0 голосов
/ 02 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...