13

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

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

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

header("Connection: Keep-alive");

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

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

提前致谢。

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

4

2 回答 2

26

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

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

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

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

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

于 2010-06-07T16:53:04.307 回答
6

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

KeepAlive On
于 2010-06-07T19:25:05.487 回答