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

时间:2010-06-07 16:42:52

标签: php apache http keep-alive

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

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

我已经尝试了一些解决这个问题的方法:不同的方法(GET和POST),在我的脚本开头用以下PHP代码显式给出响应“Connection:keep-alive”:

header("Connection: Keep-alive");

后者将预期的标题添加到响应中,这很好,但是附加的“Connection:close”仍然会在响应标题的后面附加。

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

提前致谢。

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

2 个答案:

答案 0 :(得分:25)

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

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

在Apache中也有一些设置可以阻止这种情况,例如连接上的最大请求数或请求之间的超时。这也会非常快速地占用你的资源,因为每个连接都需要自己的线程。

你应该切换到另一种解决方案,这是为这种工作而做的。

对于保持联系畅通的服务,您可以查看http://orbited.orghttp://twistedmatrix.com/trac/

答案 1 :(得分:6)

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

KeepAlive On