2

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

我正在使用 PHP 服务器端和 javascript 客户端编写“事件代码”应用程序。它是这样工作的:

  1. 当用户登录时,服务器会向他发送最后 10 个事件。这很简单!
  2. 然后,服务器在用户进入时向用户发送新事件。这就是我无法弄清楚的问题。

现在,我将事件存储在数据库中。服务器如何确定哪些事件是“新的”,哪些是“旧的”(即已经发送到客户端)?是否就像在每个事件的数据库中都有一个布尔列一样简单?

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

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

4

1 回答 1

0

与几乎所有事情一样,实现这一目标的方法不止一种,但根据您的描述,似乎 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_events 将是您的浏览器端实现,用于在浏览器中呈现新事件。

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

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

于 2014-04-01T21:33:27.420 回答