通过 MySQL 数据库更改发送 WebSocket 更新哪个更有效

Dun*_*dle 5 javascript php mysql websocket phpwebsocket

我目前正在尝试使用 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

也许这是最好的选择,因为它是最有效的,但我担心更新数据库和发送 WebSocket 通知之间的连接可能会断开,这可能需要在 PHP 文件中进行回退检查,与第一个解决方案中的非常相似,尽管间隔较长(例如每 30 秒)。

3.MySQL触发器?

这纯粹是一个猜测,但也许另一种选择是创建一个 MySQL 触发器,它可以以某种方式直接通知 server.php 文件?我不知道这是如何工作的,并且会冒险猜测这可能最终会产生与解决方案 #1 相同或相似的查询要求,但这只是一个......

预先感谢您的帮助 :)

编辑:解决方案可能性 4

事实上,另一个想法刚刚出现在我的脑海中,用于更新数据库的 PHP 文件实际上可以内置一个 WebSocket 消息。这样当PHP文件更新数据库时,通过PHP通知WebSocket服务器,这可能吗?

eis*_*eis 1

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

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


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

但是,根据您的用例,客户端仍应在下一个请求中发送哈希值,以标识其“世界观”,因此如果连接断开,您将不会多次执行相同的更新。


更新 2:所以现在我们知道您确实使用了一个单独的、独立的 websocket 服务器。基本上,您的服务器端有两个不同的 Web 服务器,并且存在如何在两者之间进行通信的问题。这是一个真正的问题,我建议一次只使用一台服务器 - 要么看看使用Apache websocket 支持(实验性的,不真正推荐),要么将 php 脚本迁移到 websocket 实例。

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