我正在尝试建立一个从Silverlight应用程序到Apache服务器托管的PHP页面(即不为每个HTTP请求创建新的TCP连接)的HTTP持久连接。
为此,我需要set服务器发送其HTTP响应,并将"Connection“标头设置为"Keep-alive”。在客户端,似乎没有任何问题,因为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连接被重新建立。Keepalive不是HTTP1.1下的默认和首选行为吗?
发布于 2010-06-08 00:53:04
Keep-Alive功能不适用于持久连接。
Keep-Alive旨在减少网站的连接数量。不是为网页中的每个图像/css/javascript创建一个新的连接,许多请求将重复使用相同的连接。
在Apache中也有一些设置可以阻止这一点,比如连接上的最大请求数或请求之间的超时。这也会非常快地消耗你的资源,因为每个连接都需要自己的线程。
您应该切换到另一个解决方案,这是为这类工作而设计的。
对于保持连接打开的服务,您可以查看http://orbited.org和http://twistedmatrix.com/trac/
发布于 2010-06-08 03:25:05
由于PHP不管理HTTP连接,因此无法更改此设置。您需要在服务器中进行设置。例如,如果您使用的是mod_php,可以在Apache中像这样启用keep-alive,
KeepAlive Onhttps://stackoverflow.com/questions/2991386
复制相似问题