我可以找到很多关于长轮询如何工作的信息(例如,这个和这个),但没有简单的例子说明如何在代码中实现这一点。

我能找到的只有cometd,它依赖DojoJS框架和一个相当复杂的服务器系统。。

基本上,我将如何使用Apache来服务请求,以及我将如何编写一个简单的脚本(例如,用PHP)来“长轮询”服务器以获取新消息?

该示例不一定是可扩展的、安全的或完整的,它只需要工作即可!


当前回答

谢谢你的代码,dbr。只有long_poller.htm中的一个小错别字

1000 /* ..after 1 seconds */

我想应该是

"1000"); /* ..after 1 seconds */

让它发挥作用。

对于那些感兴趣的人,我尝试了Django的等效版本。开始一个新的Django项目,比如说长轮询:

django-admin.py startproject lp

调用消息服务器的应用程序msgsrv:

python manage.py startapp msgsrv

将以下行添加到settings.py以创建模板目录:

import os.path
PROJECT_DIR = os.path.dirname(__file__)
TEMPLATE_DIRS = (
    os.path.join(PROJECT_DIR, 'templates'),
)

在urls.py中定义URL模式如下:

from django.views.generic.simple import direct_to_template
from lp.msgsrv.views import retmsg

urlpatterns = patterns('',
    (r'^msgsrv\.php$', retmsg),
    (r'^long_poller\.htm$', direct_to_template, {'template': 'long_poller.htm'}),
)

msgsrv/views.py应该如下所示:

from random import randint
from time import sleep
from django.http import HttpResponse, HttpResponseNotFound

def retmsg(request):
    if randint(1,3) == 1:
        return HttpResponseNotFound('<h1>Page not found</h1>')
    else:
        sleep(randint(2,10))
        return HttpResponse('Hi! Have a random number: %s' % str(randint(1,10)))

最后,templates/long_poller.htm应与上面相同,并更正了拼写错误。希望这有帮助。

其他回答

下面是我在C#中用于长轮询的一些类。基本上有6个类(见下文)。

控制器:处理创建有效响应所需的操作(数据库操作等)处理器:管理与网页(自身)的异步通信IAsynchProcessor:实现此接口的服务进程实例服务:处理实现IAsynchProcessor的请求对象请求:包含响应(对象)的IAsynchProcessor包装响应:包含自定义对象或字段

对于ASP.NET MVC实现,请查看NuGet上提供的SignalR。。请注意,NuGet与Git源代码相比常常是过时的,因为Git源经常提交。

在Scott Hanselman的博客上阅读有关SignalR的更多信息

这是PHP非常糟糕的选择之一。如前所述,您可以很快地将所有Apache工作人员绑在一起,这样做。PHP是为启动、执行和停止而构建的。它不是为开始而建造的,等等。。。执行,停止。你会很快让你的服务器陷入困境,并发现你有难以置信的扩展问题。

也就是说,您仍然可以使用PHP执行此操作,并且不会使用nginxHttpPushStreamModule杀死您的服务器:http://wiki.nginx.org/HttpPushStreamModule

您在Apache(或任何其他)前面设置nginx,它将负责保持并发连接的开放。您只需通过将数据发送到一个内部地址来响应有效负载,该地址可以通过后台作业来完成,也可以在收到新请求时将消息发送给正在等待的人。这可以防止PHP进程在长时间轮询期间处于打开状态。

这不是PHP独有的,可以使用nginx和任何后端语言来完成。并发开放连接的负载等于Node.js,所以最大的好处是它可以让你从NEEDING Node中解脱出来。

你会看到很多人提到其他语言库来完成长时间的投票,这是有充分理由的。PHP天生就不适合这种类型的行为。

我用这个来掌握Comet,我还使用Java Glassfish服务器设置了Comet,并通过订阅cometdaily.com找到了许多其他示例

这是一个关于如何使用PHP&jQuery进行长时间轮询的5分钟精彩视频:http://screenr.com/SNH

代码与上面dbr的示例非常相似。