V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mantianyu
V2EX  ›  问与答

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

  •  
  •   mantianyu · 2013-07-20 10:44:44 +08:00 · 3717 次点击
    这是一个创建于 4139 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需要服务器配置(如apache,nginx)? 还是说在服务器端代码中有特殊的写法?
    15 条回复    1970-01-01 08:00:00 +08:00
    nybux
        1
    nybux  
       2013-07-20 10:47:14 +08:00   ❤️ 1
    可以搜索一下servlet 3.0的asyncservlet
    mantianyu
        2
    mantianyu  
    OP
       2013-07-20 11:43:58 +08:00
    @nybux 那个是servlet 3.0引入的单线程异步机制,若是php不能实现吗?
    itommy
        3
    itommy  
       2013-07-20 11:48:26 +08:00 via iPhone
    没有服务器特别的配置

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

    然后就出现了 所谓的 long polling
    mlhorizon
        4
    mlhorizon  
       2013-07-20 12:13:17 +08:00
    需要服务器端支持!
    mantianyu
        5
    mantianyu  
    OP
       2013-07-20 12:21:09 +08:00
    @itommy 这样似乎需要服务器返回 multipart/x-mixed-replace ,否则服务器会一直等待php脚本执行完成才将输出发送到浏览器, 可是这种mime类型连ie10都不支持
    mantianyu
        6
    mantianyu  
    OP
       2013-07-20 12:22:26 +08:00
    @itommy 说错了,应该说,“ie连第10版都不支持这种mime类型,firefox和chrome和safari和opera等就支持”
    mantianyu
        7
    mantianyu  
    OP
       2013-07-20 12:23:47 +08:00
    @mlhorizon 比如说?如何支持?
    sivacohan
        8
    sivacohan  
       2013-07-20 13:43:20 +08:00 via Android
    如果我没记错,comet被websocket和long polling代替了。这时个过时的技术。
    mantianyu
        9
    mantianyu  
    OP
       2013-07-20 14:24:06 +08:00
    @sivacohan 查了很多资料,说是long polling其实是comet的一种实现方式,comet是个泛型名词
    nybux
        10
    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
        11
    lisztli  
       2013-07-20 19:16:34 +08:00
    关键字 epoll
    lisztli
        12
    lisztli  
       2013-07-20 19:17:02 +08:00
    zzNucker
        13
    zzNucker  
       2013-07-20 19:32:00 +08:00
    @mantianyu “服务器会一直等待php脚本执行完成才将输出发送到浏览器”

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

    http://gist.github.com/itommyyang/6048032
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5504 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 07:15 · PVG 15:15 · LAX 23:15 · JFK 02:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.