2008-10-29 2 views
5

В фиктивном веб-приложения ...Что происходит на сервере при отмене загрузки страницы в браузере?

  1. Пользователь нажимает на ссылку
  2. Сервер начинает готовить ответ, но это занимает несколько секунд
  3. Пользователь отменяет загрузку страницы

Что происходит с запросом? Продолжает ли сервер готовить ответ? Получается ли ответ в браузере?

ответ

5

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

В серверах приложений Java EE (Tomcat и WebLogic, возможно, и другие) вы получите следующее исключение:

java.net.SocketException: Connection reset by peer: socket write error 
0

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

У меня мало знаний об этих вещах, но это было бы моим догадком.

1

PHP понимает три состояния соединения: НОРМАЛЬНЫЙ, АВТОМАТИЧЕСКИЙ И ВРЕМЕН. Вы можете изменить политику PHP на соединениях ABORTED (по умолчанию завершается сценарий) с помощью функции ignore_user_abort(). От примечания раздел:

«PHP не обнаружит, что пользователь прервал соединение до тех пор, пока не будет предпринята попытка отправить информацию клиенту».

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

Для получения более подробной информации см. PHP's page on connection handling.

+0

является Apache или другим веб-браузером, отправляющим FIN/ACK на PHP? – 2012-10-30 12:55:53

1

Если соединение было нарушено до того, как запрос был полностью отправлен на сервер, обработка ответа не произойдет.

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

В ASP.NET вы можете обнаружить это, используя Response.IsClientConnected, чтобы остановить обработку, если клиент больше не подключен, экономя время процессора и немедленно возвращая поток в пул потоков.

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