comet 技术所需的长连接是如何实现的?

2013-07-20 10:44:44 +08:00
 mantianyu
需要服务器配置(如apache,nginx)? 还是说在服务器端代码中有特殊的写法?
3723 次点击
所在节点    问与答
15 条回复
nybux
2013-07-20 10:47:14 +08:00
可以搜索一下servlet 3.0的asyncservlet
mantianyu
2013-07-20 11:43:58 +08:00
@nybux 那个是servlet 3.0引入的单线程异步机制,若是php不能实现吗?
itommy
2013-07-20 11:48:26 +08:00
没有服务器特别的配置

就是 JavaScript 去request 一个php file, 然后 file 里做 loop 就可以keep connection alive.

然后就出现了 所谓的 long polling
mlhorizon
2013-07-20 12:13:17 +08:00
需要服务器端支持!
mantianyu
2013-07-20 12:21:09 +08:00
@itommy 这样似乎需要服务器返回 multipart/x-mixed-replace ,否则服务器会一直等待php脚本执行完成才将输出发送到浏览器, 可是这种mime类型连ie10都不支持
mantianyu
2013-07-20 12:22:26 +08:00
@itommy 说错了,应该说,“ie连第10版都不支持这种mime类型,firefox和chrome和safari和opera等就支持”
mantianyu
2013-07-20 12:23:47 +08:00
@mlhorizon 比如说?如何支持?
sivacohan
2013-07-20 13:43:20 +08:00
如果我没记错,comet被websocket和long polling代替了。这时个过时的技术。
mantianyu
2013-07-20 14:24:06 +08:00
@sivacohan 查了很多资料,说是long polling其实是comet的一种实现方式,comet是个泛型名词
nybux
2013-07-20 17:05:36 +08:00
php和普通的servlet都是一个请求要占用一个线程或进程,long polling需要在等待条件的时候释放掉占用的线程或进程。所以以目前php的方式就算实现,也无法支撑多少用户。
long polling是从http层面看到的东西,comet和asyncservlet是一种实现。websocket需要浏览器额外支持。
采用什么方案实现longpolling,要根据你的用户量来决定。
我觉得golang是最佳的方案。在一台普通pc上可以支持上万用户。
接着是netty,async servlet,nodejs都是可选方案。我用asyncservlet测试2万用户基本已经没法用了。
lisztli
2013-07-20 19:16:34 +08:00
关键字 epoll
lisztli
2013-07-20 19:17:02 +08:00
zzNucker
2013-07-20 19:32:00 +08:00
@mantianyu “服务器会一直等待php脚本执行完成才将输出发送到浏览器”

就算这样应该也算是长轮询吧?
长轮询应该确实是comet的一种方式
julyclyde
2013-07-21 16:13:01 +08:00
php的话,可以用obflush
itommy
2013-07-21 17:30:58 +08:00
大概就是这个原理,以前写的了,研究一下吧

http://gist.github.com/itommyyang/6048032

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/76383

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX