![当 HTTP 请求过早终止时会发生什么?](https://linux22.com/image/515266/%E5%BD%93%20HTTP%20%E8%AF%B7%E6%B1%82%E8%BF%87%E6%97%A9%E7%BB%88%E6%AD%A2%E6%97%B6%E4%BC%9A%E5%8F%91%E7%94%9F%E4%BB%80%E4%B9%88%EF%BC%9F.png)
假设我在浏览器中输入一个 URL,然后浏览器提交 HTTP 请求。远程 HTTP 服务器接受该请求并启动一个长任务来处理该请求。
如果我在请求完成之前终止请求(例如,按 Esc 或在 Firefox 中),请求将如何关闭?浏览器会将此中止请求传达给服务器吗(我认为不会)?
假设没有,那么在完成这项长任务后,服务器会如何处理结果?它会把结果发回来吗?如果会,会发生什么?它会到达我的电脑吗?还是在途中丢失了?
这只是出于我的好奇。
谢谢你的时间 :)
答案1
嗯,这完全取决于服务器正在做什么。通常,它不会“检测”已终止的请求,直到尝试发送。此时,脚本将从 Web 服务器获取 user_abort 消息(在 php 中,您可以使用 告诉它忽略用户中止ignore_user_abort(true);
)。如果不尝试向客户端发送数据,服务器就无法知道请求已中止。
当它尝试将请求发送到已关闭的 TCP 连接时,会发生什么完全取决于服务器软件。Apache 的工作方式如下:如果在动态脚本正在处理时发送的数据仍然静止,它会通知脚本有关中止的信息,并让脚本按照其想要的方式处理(默认情况下,PHP 终止)。如果脚本已完成,或者它是一个静态文件请求,它将忽略已关闭的连接并返回。
答案2
我认为它应该被认为是电的东西。电荷。当某个连接终止时,发送的数据就是一种电荷,它会消失,因为没有可用于该特定传输的监听套接字。只有存在套接字,才会发生某种通信。
例子:
我们点击http://localhost
apache2 httpd。假设它没有运行。浏览器打开一个套接字,向端口 80(默认)发送一条消息,并查看是否有任何响应。由于没有侦听器,因为 apache 没有运行,所以这个 ping 请求根本没有得到任何响应。至少 200 ok 或任何类型的握手。那么我们的 ping 会发生什么?http 发送了一些内容:比如GET http://localhost 80
...等等。这条线发生了什么??GET http://localhost 80
它只是一个收费并消失了。
这只是我的信念,我们应该首先参考TCP以便更清晰。只有这样,我们才能理解 Internet 协议和后续 http 的行为方式。最终,对于过早终止的 http 请求似乎没有具体的定义。这就是为什么它被称为过早终止。