2009-08-30 81 views
2

我正在通过长XMLHttpRequest民意测验Comet supportCppCMS框架。在许多情况下,客户在给出服务器的任何响应之前关闭这样的请求 - 例如页面关闭,用户移动到其他页面或仅刷新页面。客户端断开连接时,HTTP代理/ FastCGI/SCGI不关闭连接 - 错误或功能?

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

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

其他,Apache和Lighttpd不关闭连接或通知后端有关断开连接的 客户端,如同客户端仍处于联机状态。所有3种支持的API都会发生这种情况:FastCGI,SCGI和HTTP代理。

我已经开了一个问题的Lighttpd,但我是什么 更conserns的事实,阿帕奇 - 成熟和支持的Web服务器作为lighttpd的 和不披露该客户端已经走了服务器后端。

问题:

  1. 这是一个bug或者这是一个功能?是否有任何理由不关闭Web服务器和应用程序后端之间的连接?
  2. 现实生活Comet应用程序通过FastCGI/SCGI/HTTP-Proxy后端在这些服务器后面工作吗?
  3. 如果以上都是真的,他们如何处理这个问题?我知道我可以每隔10秒超时连接所有连接,但我希望尽可能让客户端监听它们,因为这样可以更容易地扩展 - 每个连接都非常灵活 - 成本只是打开的套接字。

谢谢!

+0

这会是很酷的,如果有在那里cppcms标签,但只能有5个标签最大...我留给你决定5个现有标签中的哪个标签可以放弃,以支持新的'cppcms'标签。如果有直接影响cppcms的SO问题可以适当标记,那将会很好。 +1。 – augustin 2011-01-10 12:11:02

回答

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

+0

我知道,除非客户端关闭连接,否则您不知道迪斯科是否发生过。通常,网页浏览器会这样做。感谢修补程序的链接......接受答案。 ;) – Artyom 2009-09-06 05:54:43

0

http://ncannasse.fr/blog/tora_comet

我没有任何具体的信息给你,但本文不提,当客户端已经从Apache的断开它们可以检测。见tora.Queue。这听起来像是neko CVS中的源代码,所以你可能会在那里找到一些线索。祝你好运。