通过MySQL数据库更改发送WebSocket更新更高效


Which is more efficient to send WebSocket updates with a MySQL database change

我目前正在试验WebSockets,以减少/消除在潜在的低带宽环境中对恒定AJAX请求的需求。所有设备都是兼容WebSocket的,所以没有问题,我正在努力将其保留为本地PHP WebSocket,没有node.js或其他框架/库(到目前为止还不错(。

我想做的是决定如何通知连接的客户端另一个客户端对数据库的更新。有问题的用例是一个人按下设备上的按钮,然后该按钮会提醒人事经理按下该按钮。因此,我有两个选择如下:

1.循环数据库查询(PHP(

我的第一个想法是在WebSocket服务器中插入一个查询,该查询实际上是在说"警报字段是否已更改?如果已更改,请通知经理"。虽然这是最直接、最明智的方法(我能想到(,但设计一个PHP脚本来减轻服务器的压力似乎是浪费,因为现在服务器每秒都在运行一个查询,然而,至少这可以确保在检测到数据库更新时,发送更新。

2.从客户端发送通知

我的另一个想法是,当客户端更新数据库时,他们实际上可以自己发送WebSocket通知。这具有减少任何密集和循环查询的优点,但也意味着我需要在每次想要更改任何数据时发送一条WebSocket消息,例如:

$.post("AttemptDatabaseUpdate.php", {Data}).function(Result) // Don't worry about the semantics of this, it's not actual code
{
    if(Result == "Successful")
    {
        SendWebSocketNotification(OtherData);
    }
}

也许这是最好的选择,因为它是最高效的,但我担心在更新数据库和发送WebSocket通知之间的连接可能会中断,这可能会在PHP文件中产生后备检查的需求,就像第一个解决方案中的一样,尽管间隔更长(比如每30秒一次(。

3.MySQL触发器

这纯粹是猜测,但也许另一个选项是创建一个MySQL触发器,它可以以某种方式直接通知server.php文件?我不知道这将如何工作,我可能会猜测这可能会导致与解决方案#1相同或相似的查询需求,但这只是一个。。。

提前感谢您的帮助:(

编辑:解决方案可能性4

事实上,我脑海中突然出现了另一个想法,即用于更新数据库的PHP文件实际上可以内置WebSocket消息。因此,当PHP文件更新数据库时,WebSocket服务器会通过PHP得到通知,这可能吗?

如果您使用websocket,您应该使用来自客户端的通知。这是它们的主要用例之一。

如果您担心由于连接断开或其间发生变化而导致的不一致,您可以实现一个类似于HTTP ETags的系统,在该系统中,客户端将发送一个哈希代码,如果在更新过程中发生冲突,您可以在服务器端做出响应。


更新:我想我对你最初的问题理解有点错误。如果我正确理解您的用例:您从客户端发送数据库更新,之后所有连接的客户端都需要更新。在这种情况下,我认为服务器应该在数据库更新完成后发送更新消息,所以我同意解决方案4。我在这里假设您的websocket服务器是运行PHP并进行DB更新的同一台服务器。

然而,根据您的用例,客户端仍然应该在下一个请求中发送一个哈希值,以识别其"世界视图",这样,如果连接断开,您就不会多次进行相同的更新。


更新2:所以现在可以理解您确实使用了一个独立的websocket服务器。基本上,您在服务器端有两个不同的web服务器,并且在如何在两者之间进行通信方面存在问题。这是一个真正的问题,我建议一次只使用一台服务器——要么考虑使用Apache websocket支持(实验性的,不建议使用(,要么将php脚本迁移到websocket实例。

无论是PHP还是Apache,都没有真正考虑到websocket。只使用PHP设置一个独立的websocket服务器是很容易的,但如果代码依赖于Apache/web服务器,那么将PHP堆栈的其余部分迁移到它可能就不那么容易了。Apache websocket支持也很难达到最佳效果。不幸的是,对于真正的websocket解决方案,最佳实践是使用从头开始为其构建的技术。

更好的答案是,当PHP脚本更新数据库时,通过服务器端发送通知,这样脚本就必须添加web套接字选项,才能直接向所有注册的web套接字客户端发送通知。

User send content->Php script process content and save data according to true condition->check database is updated by checking return of mysql_query/other alternative->if true than use web-socket and send notification to all users

现在,这更容易/方便/节省带宽。