取消 HttpRequest 后浏览器挂起直到服务器超时

Posted

技术标签:

【中文标题】取消 HttpRequest 后浏览器挂起直到服务器超时【英文标题】:Browser hangs till Timeout from server after cancelling HttpRequest 【发布时间】:2014-01-04 19:43:01 【问题描述】:

我有一个 flex 应用程序,它需要多个长 http 请求才能从服务器获取数据。在运行时,一个随机的 http 请求只是挂起。浏览器网络面板显示 http 请求待处理,直到 正好五分钟。在此期间,从同一浏览器会话向该主机名发出的任何请求都不会加载(待定)。

我尝试修改 keep-alive 请求标头,但服务器响应似乎重置为默认值,即 5 秒。

我在超时指令下的apache conf中找到了300s的值。将超时从 300 更改为 30 后,浏览器主机挂断更改为 30 秒。为什么在新标签页取消httpRequest后浏览器还在等待超时消息?

我正在使用 ustream.close() 关闭 actionscript urlstream。 urlstream 使用ustream = new URLStream() 重新初始化。在没有关闭的情况下初始化时,前一个请求会完成,导致加载速度较慢和带宽较高。我担心 actionscript close() 无法正确关闭 http 请求,但它只会发生几次。

【问题讨论】:

【参考方案1】:

罪魁祸首是 php 会话锁。服务器调用的 php 文件用于从会话中获取一些数据。 PHP 使用会话锁来确保会话数据的一致性。因此,一次只有一个文件可以保持与服务器的打开连接。当从浏览器端关闭 urlstream 时,apache 会占用下一个请求,但会等待上一个请求完成或超时。解决方案是确保在关闭流之前关闭 php 文件中的所有会话。

为了进一步减少服务器开销,我现在从 GET 参数传递一个密钥,而不是维护会话。 session_write_close 可用于阻止会话锁定。

我使用mod_statusExtendedStatus On 在this blog 的帮助下调试Apache 进程

【讨论】:

以上是关于取消 HttpRequest 后浏览器挂起直到服务器超时的主要内容,如果未能解决你的问题,请参考以下文章

取消挂起的推送通知

Python 客户端-服务器脚本挂起,直到我按下 [enter]

如何在 Angular 2 中取消 HTTPRequest?

VMware怎么开机自启动,关机自动挂起虚拟机

线程挂起,直到我附加调试器

vmware虚拟机怎么开机黑屏,无法关机挂起