在 PHP 中,我将如何立即中止 HTTP 连接,不再发送数据包。客户端应继续等待,直到浏览器内部超时
Posted
技术标签:
【中文标题】在 PHP 中,我将如何立即中止 HTTP 连接,不再发送数据包。客户端应继续等待,直到浏览器内部超时【英文标题】:In PHP, how would I abort an HTTP connection immediately, sending no further packets. Client should continue to wait until browser internal timeout 【发布时间】:2014-07-22 06:57:05 【问题描述】:我想让 php 脚本简单地结束任何通信而不发送一个进一步的数据包,这样浏览器就会一直等待,直到它放弃。
我的目标是模拟和测试 HTTP 服务器正在接受连接但随后冻结或花费非常长的时间来发送更多数据包的场景。
【问题讨论】:
对于任何感兴趣的人,我只是在其他地方偶然发现了一个相关问题:***.com/questions/100841/… 【参考方案1】:如果你终止 HTTP 连接,那么底层的 TCP 套接字也会被关闭,浏览器会立即知道。我猜这不是你想要的。所以,如果你想模拟一个长时间的超时,那么就这样做吧:
sleep(315360000); // Sleep for 10 YEARS!
请注意,PHP 的脚本超时不会在它处于睡眠状态时(或在任何其他系统调用中)发生。
【讨论】:
我对 TCP/IP 的细节不是很熟悉。如果服务器只是停止响应(本地释放 TCP 套接字而不向客户端发送任何进一步的数据包),浏览器会“立即知道”吗?主机不会一直等待更多的 TCP 数据包直到超时吗? @DG - TCP 协议确实有您的程序不可见的服务数据包。这就是建立“连接”和实现可靠性的方式(请记住 - 底层 IP 协议不保证数据包将以正确的顺序到达,甚至根本无法到达)。因此,当您close()
套接字时,会有特殊的数据包被发送并通知对方。您可以放弃套接字并且什么都不做,但这会浪费服务器资源(操作系统仍会认为您正在使用它,因此缓冲区等将保持活动状态)。
@DG - 执行那种实际上会模拟切断电缆的“放弃”需要相当复杂的编程,而且无论如何 PHP/Apache 都不可能,因为它们抽象远离套接字本身,您不能直接对它们进行操作。
@DG - 如果您有兴趣,wikipedia article 似乎相当彻底。
谢谢。回答接受。仅供参考,我的新问题:***.com/questions/24132551/…以上是关于在 PHP 中,我将如何立即中止 HTTP 连接,不再发送数据包。客户端应继续等待,直到浏览器内部超时的主要内容,如果未能解决你的问题,请参考以下文章