我正在通过长XMLHttpRequest民意调查为Comet support框架CppCMS工作。在许多情况下,在给出服务器的任何响应之前,客户端会关闭此类请求 - 例如,页面关闭,用户移动到其他页面或者只是刷新。
在服务器端,我希望我会收到连接被删除的通知。我通过3个连接器测试了应用程序:FastCGI,SCGI和简单的HTTP代理。
从3个主要的UNIX Web服务器,Apache2,lighttpd和Nginx,只有最后一个已关闭 连接按预期允许我的应用程序从等待队列中删除请求 - 这适用于FastCGI和HTTP代理连接器。 (默认情况下,Nginx没有scgi模块。)
其他人,Apache和Lighttpd不会关闭连接或通知后端有关断开连接的信息 客户端,就像客户端仍然在线一样。所有3种支持的API都会出现这种情况:FastCGI,SCGI和HTTP代理。
我为Lighttpd打开了一个问题,但是什么 更让我感到震惊的是Apache - 成熟且支持良好的Web服务器作为lighttpd 并且没有公开客户端已经离开的服务器后端。
问题:
谢谢!
答案 0 :(得分:4)
(1)功能。或者,更具体地说,从实现细节中得出结论。
TCP / IP连接不涉及来回的持续流量。因此,没有办法知道客户端没有(a)客户端告诉你它正在关闭连接或(b)超时。
(2)我不熟悉Comet或CppCMS。但是,是的,有各种各样的CMS服务器在提到的Web服务器后面运行,他们都必须处理这个问题(是的,这很痛苦)。
(3)超时是唯一的方法,但你可以减轻痛苦,可以这么说。当没有活动时,让客户端每隔N秒通过连接ping服务器。不需要做任何事情,你可以在答复上加以处理;并发编辑或任何你需要的通知。
你是对的,因为mod_fastcgi不支持告诉后端Apache已检测到断开连接或连接超时,这是令人惊讶的。你并不是第一个感到沮丧的人。
此页面上的第二个补丁应修复该特定问题:
答案 1 :(得分:0)
http://ncannasse.fr/blog/tora_comet
我没有任何具体信息,但本文确实提到他们可以检测客户端何时与Apache断开连接。见tora.Queue
。听起来neko CVS中提供了源代码,因此您可以在那里找到一些线索。祝好运。