服务器响应中的 "Connection: Keep-Alive"

13
我正在尝试从Silverlight应用程序建立一个HTTP持久连接到由Apache服务器托管的PHP页面(即在每个HTTP请求中不创建新的TCP连接)。
为此,我需要Web服务器使用“Connection”标头设置为“Keep-Alive”发送其HTTP响应。在客户端方面,似乎没有任何问题,因为Silverlight提供的网络API基本上是浏览器网络功能的包装器,根据我所读到的:如果浏览器默认支持HTTP 1.1和Connection:Keep-Alive进行请求,则很好。Content-Length也定义良好,因此服务器知道何时发送响应。然而,对PHP请求的服务器响应系统地将“Connection:”设置为“close”,从而结束了连接并防止持久连接。
我已经尝试了一些解决此问题的方法:使用不同的方法(GET和POST),在我的脚本开头使用以下PHP代码明确地给出“Connection:keep-alive”的响应:
header("Connection: Keep-alive");
后者会向响应添加期望的标题,这很好,但是在响应标头中仍然附加了一个额外的“Connection: close”。这是 PHP 或 Apache 的特性吗?它强制执行“close”(出于某种安全或性能目的,我猜测),还是我漏掉了什么?提前感谢您的回答。顺便说一句,通过嗅探数据包,我注意到很少有网站使用“Keep-alive”,而TCP连接得到重新建立。在 HTTP 1.1 下,不是 Keepalive 是默认和首选行为吗?

据我所知,那可能是Apache而不是PHP控制的。您可以通过尝试通过相同的连接请求静态文件来验证。Apache指令:http://httpd.apache.org/docs/2.2/mod/core.html#keepalive - Frank Farmer
2个回答

27

保持连接功能不适用于长连接。

保持连接旨在减少网站的连接数。与为网页中的每个图像/ CSS / JavaScript 创建新连接不同,将重复使用同一连接进行许多请求。

在Apache中也有一些设置可以防止此类现象,例如连接上的最大请求数或请求之间的超时。每个连接需要自己的线程,因此这也会迅速耗尽您的资源。

你应该切换到另一个专为此类工作而设计的解决方案。

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


1
不要滥用HTTP进行持久连接,如果需要的话,让PHP守护进程监听一个端口/套接字就足够简单了。 - Wrikken
是的,这也是一种可能性。在我看来,Orbited可以更轻松地实现这一点,并且更稳定,同时仍然提供基本的HTTP服务器 :) - favo
我正在编写一个实时即时通讯应用程序(类似于Google Wave的实时功能),在受限环境中进行编程(仅使用PHP和最少的Web服务器功能)。我甚至不被允许使用数据库。在这种高压请求下(每个按键基本上都会产生一个请求),保持与服务器的连接活动状态将非常有用。感谢您的建议。 - ZenithM
如果你能提供比ZZ Coder更好的答案,那就加1分。保持连接与zenithm在上面评论中描述的任务几乎没有什么关系——有几种方法可以实现,COMET是其中之一,尽管对于可扩展系统来说,ajax轮询是更好的选择。 - symcbean
这个答案更详细,但我认为我的问题只是 Apache 的配置。不过,感谢您向我指出了 Comet 解决方案,我会研究一下的。 - ZenithM
我也必须明确,我对Web服务器通过长连接将数据推送到SL应用程序毫不费力。反过来则会让我感到困扰。 - ZenithM

6

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

KeepAlive On

谢谢,我的服务器上似乎确实将此参数设置为关闭。 - ZenithM
这将为所有请求启用保持连接功能。 - lolc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接