【问题标题】:"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 下的默认和首选行为吗?

【问题讨论】:

标签: php apache http keep-alive


【解决方案1】:

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

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

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

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

对于保持连接打开的服务,您可以查看 http://orbited.orghttp://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

【讨论】:

  • 谢谢,这个参数在我的服务器上似乎确实设置为关闭。
  • 这使得所有请求都保持活动状态
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多