3

我正在通过长 XMLHttpRequest 轮询为CppCMS框架提供Comet 支持。在许多情况下,这样的请求在服务器给出任何响应之前就被客户端关闭了——例如页面被关闭,用户移动到其他页面或者它只是被刷新。

在服务器端,我希望我会收到连接断开的通知。我通过 3 个连接器测试了应用程序:FastCGI、SCGI 和简单的 HTTP 代理。

从 3 个主要的 UNIX Web 服务器 Apache2、lighttpd 和 Nginx 中,只有最后一个按预期关闭了连接,允许我的应用程序从等待队列中删除请求——这适用于 FastCGI 和 HTTP 代理连接器。(Nginx 默认没有 scgi 模块)。

其他的,Apache 和 Lighttpd 不会关闭连接或通知后端断开客户端,继续进行,就好像客户端仍然在线一样。这适用于所有 3 个受支持的 API:FastCGI、SCGI 和 HTTP 代理。

我已经为Lighttpd打开了一个问题,但更让我担心的是 Apache——作为 lighttpd 的成熟且得到良好支持的 Web 服务器,并且没有透露客户端已经离开的服务器后端。

问题:

  1. 这是一个错误还是一个功能?是否有任何理由不关闭 Web 服务器和应用程序后端之间的连接?
  2. 是否有现实生活中的 Comet 应用程序通过 FastCGI/SCGI/HTTP-Proxy 后端在这些服务器后面工作?
  3. 如果上述情况属实,他们如何处理这个问题?我知道我可以每 10 秒超时一次所有连接,但我想让它们在客户端监听时保持空闲——因为这样可以更容易地扩大规模——每个连接都非常便宜——成本只是打开的套接字。

谢谢!

4

2 回答 2

4

(1) 特征。或者,更具体地说,是实现细节的后果。

TCP/IP 连接不涉及来回不断的流量。因此,如果没有(a)客户端告诉您它正在关闭连接或(b)超时,就无法知道客户端已经消失。

(2) 我对 Comet 或 CppCMS 不是特别熟悉。但是,是的,在提到的 Web 服务器后面运行着各种各样的 CMS 服务器,它们都必须处理这个问题(而且,是的,这很痛苦)。

(3) 超时是唯一的方法,但可以说可以减轻痛苦。当没有任何活动时,让客户端每隔 N 秒通过连接对服务器执行一次 ping 操作。无需做任何事情,您可以在回复中添加内容;并发编辑的通知或您需要的任何内容。

您是正确的,令人惊讶的是 mod_fastcgi 不支持告诉后端 Apache 已检测到断开连接或连接超时。你不是第一个感到沮丧的人。

此页面上的第二个补丁应解决该特定问题:

http://osdir.com/ml/web.fastcgi.devel/2006-02/msg00015.html

于 2009-09-06T00:53:45.177 回答
0

http://ncanasse.fr/blog/tora_comet

我没有任何具体信息给你,但是这篇文章确实提到他们可以检测到客户端何时与 Apache 断开连接。见tora.Queue。听起来源代码在 neko CVS 中可用,因此您可能可以在那里找到一些线索。祝你好运。

于 2009-09-06T00:06:35.887 回答