Почему apache не обрабатывает несколько запросов от одного и того же браузера одновременно
Я не совсем уверен, как правильно сформулировать этот вопрос, поэтому начну со сценария, с которым я столкнулся.
У меня есть небольшая обработка в моем веб-приложении, которая занимает больше времени, чем я хотел бы, чтобы пользователь ждал, чтобы снова получить контроль над страницей, поэтому я решил обработать ее с помощью ajax-запроса.
Проблема в том, что даже если я перенес этот запрос в запрос ajax, похоже, что apache не будет обрабатывать дальнейшие запросы до тех пор, пока не будет завершен оригинальный тяжелый запрос процессора.
Первоначально я хотел знать, как я могу обойти эту проблему, но с тех пор решил, что это может быть плохой идеей в целом.
Тем не менее, мне все еще любопытно, если кто-нибудь знает, почему apache ведет себя так и какая (если таковая имеется) директива конфигурации управляет им. Моей первоначальной мыслью было KeepAlive, но отключение, которое, казалось, не меняло поведение.
Я запускаю php через mod_php, если это имеет значение.
Я ценю любую помощь, направленную в правильном направлении!
3 ответа
Вы используете файловые сессии? PHP будет блокировать файлы сеанса для каждого запроса и поддерживать эту блокировку, пока вы не выполните session_write_close()
или скрипт завершается / выходит. Побочным эффектом этого является то, что все запросы становятся последовательными, поскольку все они конкурируют за один и тот же ресурс (файл сеанса).
Я уверен, что это файл сессии. У меня та же проблема. Я выполняю длинный запрос, такой как SQL-вставка PHPMyAdmin, обработка которого занимает несколько минут. Пока он обрабатывается, я пытаюсь открыть новую вкладку в том же браузере и перейти на любую страницу на моем веб-сайте, и она не будет открыта до тех пор, пока не будет выполнен исходный запрос PHPMyAdmin. Если я открою инкогнито окно в том же браузере, оно будет работать нормально. Если я открою сайт в любом другом браузере, это нормально. Так что это, вероятно, файловый сеанс, который используется по умолчанию для PHP.
Другие упоминали, что собирались в memcached. Вы также можете сохранить сеансы в базе данных. Прежде чем перейти к memcached, вы можете вначале сделать все, что связано с сессиями. Скопируйте переменную сеанса во временную переменную, чтобы вы могли закрыть ее и закрыть. А затем, если вам нужно установить значение сеанса, позже откройте его и внесите изменения, а затем быстро закройте его.
Можете ли вы указать на доказательства того, что это Apache? Если ваша настройка apache не является оптимальной, скорее всего, ожидание вашей страницы - это что-то другое, может быть, вы установили, что ваш вызов ajax не асинхронный?