websocket和数据库更新(按更改)

And*_*dré 5 javascript php mysql websocket node.js

我今天开始学习Websocket,因为我想拥有一个可以获取实时更新的体系结构。

我创建了第一个websockets node.js和socket.io应用程序,因此我可以通过javascript在客户端和服务器之间进行通信。很好

但是我需要一些可以与MySQL进行通信的东西,以便对于某个表上的每个更改,它都必须告诉客户端有一个更改。

因此,我一直在考虑node.js服务器与观察数据库的PHP脚本进行通信。但是然后我也需要长时间拉动以请求更改,因此无论如何我都可以使用ajax进行操作,因此这将毫无用处。

所以我的问题是:如何实现从数据库表或某个查询中获取实时数据更改,从而将更新发送到所有实时连接的客户端,而无需进行长时间轮询?

谢谢 !

EMX*_*EMX 5

所以我的问题是:如何实现从数据库表或某个查询中获取实时数据更改...

有一个模块可以监视 MySQL 事件:mysql-events

官方示例:

var MySQLEvents = require('mysql-events');
var dsn = {
  host:     _dbhostname_,
  user:     _dbusername_,
  password: _dbpassword_,
};
var mysqlEventWatcher = MySQLEvents(dsn);
var watcher =mysqlEventWatcher.add(
  'myDB.table.field.value',
  function (oldRow, newRow, event) {
     //row inserted 
    if (oldRow === null) {
      //insert code goes here 
    }

     //row deleted 
    if (newRow === null) {
      //delete code goes here 
    }

     //row updated 
    if (oldRow !== null && newRow !== null) {
      //update code goes here 
    }

    //detailed event information 
    //console.log(event) 
  }, 
  'match this string or regex'
);
Run Code Online (Sandbox Code Playgroud)

...这会将更新发送到所有实时连接的客户端,而无需长时间轮询?

您可以使用socket.io并通过在客户端上执行此操作来完全阻止初始 http 轮询:

var socket = io({transports: ['websocket'], upgrade: false});
Run Code Online (Sandbox Code Playgroud)

为避免客户端使用轮询,请将此行添加到服务器:

io.set('transports', ['websocket']);
Run Code Online (Sandbox Code Playgroud)

并将事件发送到所有连接的 (socket.io) 客户端,mysql-event使用以下命令:

io.sockets.emit('db-event',eventDataObj)
Run Code Online (Sandbox Code Playgroud)