服务器响应中的“连接:保持活动”

Posted

技术标签:

【中文标题】服务器响应中的“连接:保持活动”【英文标题】:"Connection: Keep-Alive" in server response 【发布时间】:2011-02-28 19:14:36 【问题描述】:

我正在尝试建立从 Silverlight 应用程序到由 Apache 服务器托管的 php 页面的 HTTP 持久连接(即不为每个 HTTP 请求创建新的 TCP 连接)。

为此,我需要网络服务器发送其 HTTP 响应,并将“Connection”标头设置为“Keep-alive”。客户端,似乎没有任何问题,因为 Silverlight 提供的网络 API 基本上是浏览器网络功能的包装,从我读过的内容来看:所以如果浏览器支持 HTTP 1.1 和 Connection: Keep-Alive默认情况下,它的请求,没关系。 Content-Length 也很好定义,以便服务器知道什么时候 它必须发送响应。但是,服务器对 PHP 请求的响应系统地将“Connection:”设置为“close”,从而终止连接并阻止持久连接。

我尝试了一些方法来解决这个问题:不同的方法(GET 和 POST),在我的脚本开头使用以下 PHP 代码显式地为响应提供“连接:保持活动”:

header("Connection: Keep-alive");

后者将预期的标头添加到响应中,这很好,但是稍后仍会在响应标头中附加一个附加的“连接:关闭”。

它是 PHP 或 Apache 的一个特性,它强制“关闭”(我猜是出于某种安全或性能目的)还是我只是在这里遗漏了什么?

提前致谢。

附: : 通过嗅探数据包,我注意到没有多少网站使用“保持活动”并且重新建立 TCP 连接。 Keepalive 不是 HTTP 1.1 下的默认和首选行为吗?

【问题讨论】:

这可能是 apache,而不是 PHP——据我所知,PHP 无法控制它。您可以通过尝试通过同一连接请求静态文件来进行验证。 Apache 指令:httpd.apache.org/docs/2.2/mod/core.html#keepalive 【参考方案1】:

Keep-Alive 功能不适用于持久连接。

Keep-Alive 旨在减少网站的连接数。许多请求将重复使用相同的连接,而不是为网页中的每个图像/css/javascript 创建新连接。

在 Apache 中也有一些设置可以防止这种情况发生,例如连接上的最大请求数或请求之间的超时。这也会很快消耗您的资源,因为每个连接都需要自己的线程。

您应该切换到另一种解决方案,该解决方案专为此类工作而设计。

对于保持连接打开的服务,您可以查看 http://orbited.org 和 http://twistedmatrix.com/trac/

【讨论】:

+1 表示不滥用 HTTP 进行持久连接。如果需要,让 PHP 守护进程监听端口/套接字很容易。 是的,这也是一种可能。在我看来,orbited 可以做到这一点更容易,更稳定,同时仍然提供基本的 http 服务器 :) 我正在一个受限的上下文(仅限 PHP 和最少的网络服务器功能)中编写一个实时即时消息应用程序(有点像实时方面的 Google Wave)。我什至不允许使用数据库。在这种压力请求中(每次击键基本上都会产生一个请求),保持与服务器的连接是有用的。谢谢你的建议。 +1 获得比 ZZ Coder 更好的答案。 Keep-Alives 与 zenithm 上面评论中描述的任务几乎没有关系 - 有几种方法,COMET 浮现在脑海中,尽管 ajax 轮询是可扩展系统的更好选择。 这个答案肯定更详细,但我认为我的问题只是 Apache 配置。不过,感谢您向我指出 Comet 解决方案。我会调查的。【参考方案2】:

由于 PHP 不管理 HTTP 连接,因此无法更改此设置。您需要在服务器中进行设置。例如,如果你使用 mod_php,你可以在 Apache 中像这样启用 keep-alive,

KeepAlive On

【讨论】:

谢谢,这个参数在我的服务器上似乎确实设置为关闭。 这使得所有请求都保持活动状态

以上是关于服务器响应中的“连接:保持活动”的主要内容,如果未能解决你的问题,请参考以下文章

如何保持 HttpClient 连接保持活动状态?

如何从 rac_sequence、reactive cocoa、ios 获取项目

在 Apache2 中删除 http 标头

连接保持活动在某些主机上无法与 System.Net.Http.HttpClient 一起使用

服务器端的服务器发送事件成本

是否可以通过一个 TCP 连接建立两个 SOCKSv4a 会话连接?