在一个虚构的Web应用程序...当浏览器中的页面加载被取消时,服务器中会发生什么?
- 用户点击一个链接
- 服务器开始准备响应,但它需要几秒钟
- 用户取消页面加载
请求发生了什么? 服务器是否继续准备响应? 响应是否到达浏览器?
在一个虚构的Web应用程序...当浏览器中的页面加载被取消时,服务器中会发生什么?
请求发生了什么? 服务器是否继续准备响应? 响应是否到达浏览器?
服务器将继续准备响应。当它试图发送响应给客户端时,它会失败。实际发生的这可能取决于实际的应用服务器实现,响应是否被缓冲等。
在Java EE应用服务器(Tomcat和WebLogic,可能还有其他应用服务器)中,您将得到以下例外:
java.net.SocketException: Connection reset by peer: socket write error
我认为实际的TCP连接被浏览器关闭,因此Web服务器将无法发送数据,除非它被专门编程为在准备数据时检测到断开的连接,那么该页面将是即使用户取消,也可以完全处理。
虽然我对这些东西知之甚少,但这是我的猜想。
PHP了解三种连接状态:NORMAL,ABORTED和TIMEOUT。您可以使用ignore_user_abort()函数在ABORTED连接(默认情况下,脚本已终止)上更改PHP的策略。从笔记部分:
“PHP将不会检测到用户已中止连接,直到尝试向客户端发送信息。”
请注意,如果您的服务器的输出被缓冲,发送可能不会立即发生。
查看PHP's page on connection handling了解更多详情。
如果连接在请求完全发送到服务器之前中断,则不会发生响应处理。
如果请求完全发送,则会触发服务器端处理,尽管连接断开,响应生成仍会继续。
在ASP.NET中,通过使用Response.IsClientConnected可以检测到此情况,以便在客户端不再连接时停止处理,从而节省CPU时间并立即将线程返回到线程池。
是Apache或其他webrowser发送FIN/ACK到PHP? – 2012-10-30 12:55:53