Javascript 服务器推送:服务器如何判断消息是否已经发送到客户端?

Javascript 服务器推送:服务器如何判断消息是否已经发送到客户端?,javascript,websocket,socket.io,server-push,sockjs,Javascript,Websocket,Socket.io,Server Push,Sockjs,我对服务器推送技术(websockets、socket.io、sockjs)非常陌生,所以这可能是一个非常新的问题。然而,我的google fu还没有强大到能够找到答案 我正在使用PHP服务器端和javascript客户端编写一个“事件提示器”应用程序。它的工作原理如下: 当用户登录时,服务器向他发送最后10个事件。这很容易 然后,服务器向用户发送新事件。这就是我很难弄明白的 现在,我将事件存储在数据库中。服务器如何判断哪些事件是“新的”,哪些是“旧的”(即已经发送到客户端)?它是否像在数据库中

我对服务器推送技术(websockets、socket.io、sockjs)非常陌生,所以这可能是一个非常新的问题。然而,我的google fu还没有强大到能够找到答案

我正在使用PHP服务器端和javascript客户端编写一个“事件提示器”应用程序。它的工作原理如下:

  • 当用户登录时,服务器向他发送最后10个事件。这很容易
  • 然后,服务器向用户发送新事件。这就是我很难弄明白的
  • 现在,我将事件存储在数据库中。服务器如何判断哪些事件是“新的”,哪些是“旧的”(即已经发送到客户端)?它是否像在数据库中为每个事件设置一个布尔列那样简单

    编辑:澄清我的问题:我知道如何设置服务器推送客户端。。。实际上,websockets、sockjs和socket.io都有相同的API,它们都是这样设计的。我还知道如何设置PHP以在事件循环中运行。有关于这方面的教程。Python、Ruby和Javascript也没有本机支持,而是使用非本机框架来实现


    我的问题是关于数据库交互的细节:例如,我的服务器端脚本如何知道数据库已经更新?轮询数据库是我能想到的唯一解决方案,但这似乎不是最优的。我使用的是MySQL,所以它不是一个事件驱动的数据库。我使用MySQL的原因是网站的其余部分都使用MySQL。错误的选择?我应该考虑转换到不同的DBMS吗?或者MySQL可以在这个应用程序中工作吗?

    与几乎所有的东西一样,实现这一点的方法不止一种,但根据您的描述,似乎websockets就是一种方法

    在浏览器端,检查是否支持websocket,如果支持,请添加代码:

    var ws = new WebSocket("ws://YOUR_HOST/your_path/");
    ws.onopen = function () {};
    ws.onmessage = function (evt)
    {
        render_events(evt.data);
    };
    ws.onclose = function () {};
    
    其中render_事件将是浏览器端实现,用于在浏览器中渲染新事件

    关于服务器端,原则上决定发送哪些事件就像您描述的那样简单,然而,由于普通的PHP并不意味着在事件循环中运行,而只是处理一个请求并退出,以便扫描数据库中的更改并将其发送给客户端,也许您应该尝试reactphp或PHP libevent,尽管我对这两种方法都没有经验


    另一种选择是使用Python或其他更适合等待和响应事件的语言。

    为了澄清我的问题(我将编辑上面的原始问题):我知道如何设置服务器推送客户端。。。顺便说一句,websockets、sockjs和socket.io都有相同的API,它们都是这样设计的。我还知道如何设置PHP以在事件循环中运行。有关于这方面的教程。顺便说一句,Python、Ruby和Javascript也没有本机支持,并且使用非本机框架来实现。我的问题是关于数据库交互的详细信息:例如,我的服务器端脚本如何知道数据库已经更新?我使用的是MySQL,所以它不是一个事件驱动的数据库。我使用MySQL的原因是网站的其余部分都使用MySQL。错误的选择?我应该考虑转换到另一个数据库吗?或者可以让MySQL在这个应用程序中工作吗?服务器不是接收更新数据库的触发器的服务器吗?不能使用相同的触发器来更新客户端吗?如果不是这样的话,也许像这样的事情会有所帮助,但这是一个有趣的问题。