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