Php 如何像facebook ticker、meetup.com主页那样显示持续的实时更新?

Php 如何像facebook ticker、meetup.com主页那样显示持续的实时更新?,php,python,node.js,asynchronous,real-time,Php,Python,Node.js,Asynchronous,Real Time,如何在像facebook ticker这样的浏览器中显示持续的实时更新,meetup.com主页是这样做的?在python、PHP、node.js中,对服务器端的性能有什么影响? 此外,如果页面由akamai等CDN缓存,我们如何实现相同的更新呢?您可以使用轮询、长轮询或推送系统。最简单的方法是投票。但是,所有解决方案都需要客户端编码 性能影响取决于您的解决方案。最容易实现的是投票。一个短频率的民意测验有效地每100毫秒模拟一次请求。长时间的民意测验影响较小,但它会在或多或少的时间内保留大量的请

如何在像facebook ticker这样的浏览器中显示持续的实时更新,meetup.com主页是这样做的?在python、PHP、node.js中,对服务器端的性能有什么影响?
此外,如果页面由akamai等CDN缓存,我们如何实现相同的更新呢?

您可以使用轮询、长轮询或推送系统。最简单的方法是投票。但是,所有解决方案都需要客户端编码

性能影响取决于您的解决方案。最容易实现的是投票。一个短频率的民意测验有效地每100毫秒模拟一次请求。长时间的民意测验影响较小,但它会在或多或少的时间内保留大量的请求。

这些是实现Comet的方法

我建议使用Socket.io,它是用Node.js实现的


因为它利用了最佳可用连接方法,所以我建议使用SockJS或socket.io作为客户端JavaScript库来实现类似套接字的连接,然后在服务器端使用Tornado将任何状态更改发布到客户端。代码相当简单

客户端代码取决于您选择的库。SockJS或SocketIO。或者,如果您只想直接使用WebSocket,则非常简单:

update_socket = new WebSocket("ws://my_server.com/listening_url");
update_socket.onmessage = function (evt) {
    $("#my_div").html(evt);
};
服务器端代码也非常简单:

import tornado

class UpdateHandler(tornado.websocket.WebSocketHandler):

    def open(self):
        self.write_message('Hi client')
        # listen for some events that are occurring
        for message in function_that_generates_events():
            self.write(message) 

    def on_message(self, message):
        # Do something with incoming messages

    def on_close(self):
        # tidy up

app = tornado.web.Application(('r/listening_url',UpdateHandler))
app.listen(9000)
您有两个选项(其他人在上面详细介绍了这两个选项)。如果您不熟悉每个选项背后的一些概念性想法,我想我会给出一两行关于它们的建议。请注意,我在非常非常高的层次上介绍这些概念

你的三个选择是:

  • 短轮询
  • Web套接字
  • 彗星/长轮询
  • 短轮询 短轮询通过强制客户端连续向表单的服务器发送请求,克服了客户端与服务器之间的单向通信:

    Client: Do you have a message for me?
    Server: No.
    Client: (wait x seconds)
    Client: Do you have a message for me?
    Server: No.
    Client: (wait x seconds)
    Client: Do you have a message for me?
    Server: Yes. Here it is!
    Client: Yay!
    Client: (update message)
    
    代表客户机的持续唠叨称为轮询。为了实现这种结构,您需要将服务器设置为“侦听”来自客户端的这些轮询请求。服务器还必须将这些消息存储在某个地方,以便在消息准备就绪时,服务器可以传递它们。在非常高的简化级别上,您的服务器需要:

    • 接受一般web请求
    • 接受轮询请求
    • 运行获取消息的后台作业
    • 将这些消息存储在某个位置,以便当轮询请求传入时,服务器可以检查它们
    您还需要将这些轮询请求与用户的某种会话ID联系起来,以便将正确的消息传递给正确的人。总的来说,这种范式是复杂的,在我看来,效率低下

    双向信息传输 Web套接字是HTML5的新功能。它们背后的基本思想是,客户机可以保持与服务器的直接连接,并且它们可以相互推送信息。因此,与通常的方式不同:客户端发送GET请求>>服务器用内容响应,Web套接字允许您保持连续对话

    但是,要设置此选项,您需要:

    • 与WebSocket兼容的浏览器(并非所有浏览器都兼容)
    • 可以处理web套接字的服务器(不确定如何表达,但并非所有服务器都是为这种安排而设置的)
    设置有些复杂,尽管比长轮询简单:

    • 客户端维护到Web套接字的连接,并启用到服务器的连接
    • 服务器通过web套接字将结果推送到客户端
    • 客户端根据结果更新页面
    你会看到这种模式被称为推送通知(当然,如果你有一部iPhone,你也经历过这种情况),因为服务器已经被授权将“东西”推送到客户端(多么不礼貌!)。由于客户机和服务器之间有很多细微差别,我建议测试类似的东西,它基本上是一个web服务,用于处理web套接字的所有硬部分。这将是一个简单的方式,让你测试和发挥模式,然后再开始设置自己。它既有客户端库,也有服务器端库

    希望这些信息能为您提供解决问题的基线。其他答案有关于如何解决每个场景的更直接的信息

    彗星/长轮询 另一种看似跨浏览器的Web套接字方法是长轮询(请参阅)。在这种情况下,您的客户机建立了与服务器的连接,并将其挂起,等待数据被推回。这方面的设置有些复杂,但它确实代表了短轮询Web套接字之间的中间地带