我可以找到很多关于长轮询如何工作的信息(例如,这个和这个),但没有简单的例子说明如何在代码中实现这一点。
我能找到的只有cometd,它依赖DojoJS框架和一个相当复杂的服务器系统。。
基本上,我将如何使用Apache来服务请求,以及我将如何编写一个简单的脚本(例如,用PHP)来“长轮询”服务器以获取新消息?
该示例不一定是可扩展的、安全的或完整的,它只需要工作即可!
我可以找到很多关于长轮询如何工作的信息(例如,这个和这个),但没有简单的例子说明如何在代码中实现这一点。
我能找到的只有cometd,它依赖DojoJS框架和一个相当复杂的服务器系统。。
基本上,我将如何使用Apache来服务请求,以及我将如何编写一个简单的脚本(例如,用PHP)来“长轮询”服务器以获取新消息?
该示例不一定是可扩展的、安全的或完整的,它只需要工作即可!
当前回答
你可以试试icomet(https://github.com/ideawu/icomet),一个用libevent构建的C1000K C++comet服务器。icomet还提供了一个JavaScript库,使用起来非常简单
var comet = new iComet({
sign_url: 'http://' + app_host + '/sign?obj=' + obj,
sub_url: 'http://' + icomet_host + '/sub',
callback: function(msg){
// on server push
alert(msg.content);
}
});
icomet支持多种浏览器和操作系统,包括Safari(iOS、Mac)、IE(Windows)、Firefox、Chrome等。
其他回答
看看这篇博文,里面有Python/Django/gevent中一个简单聊天应用程序的代码。
这是PHP非常糟糕的选择之一。如前所述,您可以很快地将所有Apache工作人员绑在一起,这样做。PHP是为启动、执行和停止而构建的。它不是为开始而建造的,等等。。。执行,停止。你会很快让你的服务器陷入困境,并发现你有难以置信的扩展问题。
也就是说,您仍然可以使用PHP执行此操作,并且不会使用nginxHttpPushStreamModule杀死您的服务器:http://wiki.nginx.org/HttpPushStreamModule
您在Apache(或任何其他)前面设置nginx,它将负责保持并发连接的开放。您只需通过将数据发送到一个内部地址来响应有效负载,该地址可以通过后台作业来完成,也可以在收到新请求时将消息发送给正在等待的人。这可以防止PHP进程在长时间轮询期间处于打开状态。
这不是PHP独有的,可以使用nginx和任何后端语言来完成。并发开放连接的负载等于Node.js,所以最大的好处是它可以让你从NEEDING Node中解脱出来。
你会看到很多人提到其他语言库来完成长时间的投票,这是有充分理由的。PHP天生就不适合这种类型的行为。
这里是Erik Dubelboer使用Content类型:multipart/x-mixed-replace-header在PHP中的一个简单的长轮询示例:
<?
header('Content-type: multipart/x-mixed-replace; boundary=endofsection');
// Keep in mind that the empty line is important to separate the headers
// from the content.
echo 'Content-type: text/plain
After 5 seconds this will go away and a cat will appear...
--endofsection
';
flush(); // Don't forget to flush the content to the browser.
sleep(5);
echo 'Content-type: image/jpg
';
$stream = fopen('cat.jpg', 'rb');
fpassthru($stream);
fclose($stream);
echo '
--endofsection
';
下面是一个演示:
http://dubbelboer.com/multipart.php
这是一个关于如何使用PHP&jQuery进行长时间轮询的5分钟精彩视频:http://screenr.com/SNH
代码与上面dbr的示例非常相似。
为什么不考虑web套接字而不是长轮询?它们非常高效且易于设置。然而,它们仅在现代浏览器中受支持。这里是一个快速参考。