【问题标题】:Which is more efficient to send WebSocket updates with a MySQL database change通过 MySQL 数据库更改发送 WebSocket 更新更有效
【发布时间】:2013-11-12 13:53:32
【问题描述】:

我目前正在尝试使用 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文件更新数据库时,通过PHP通知WebSocket服务器,这可能吗?

【问题讨论】:

  • 您考虑过使用 SSE(服务器端事件)吗?
  • 不是在此之前,只是查看了它们,虽然它们确实有潜力,但我觉得有一个事件监听器会比只推送一个通知效率低?尤其是随着系统的发展,许多类似的用例都可能通过一个系统运行。或者是否有某种方式让 SSE 执行“在 MySQL 数据库更新时,通知 WebSocket 服务器”方面?
  • 对于单向,SSE 似乎更易于实施和管理,并且从一些文章中阅读,它们的性能似乎相似。我认为处理更新的脚本也可以用于在数据库中成功更新后将更新推送出去。

标签: javascript php mysql websocket phpwebsocket


【解决方案1】:

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

如果您担心由于连接断开或中间发生变化而导致的不一致,您可以实现一个类似于HTTP ETags 的系统,其中客户端将发送一个哈希码,如果有更新冲突。


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

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


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

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

【讨论】:

  • 让我担心的不是更新冲突,而是如果用户更新了数据库,那么他们的连接就会断开,数据库会设置警报,但客户端不会已通知那些通过 WebSocket 连接的人。根据您的第一点,我仍然会使用 WebSockets 来通知客户端,我只是通过服务器启动原始通知,因为该通知已经按原样来自服务器(解决方案 #4)。这似乎解决了两者之间连接中断的可能性?
  • @Redgie 好的,那么我想我理解你最初的问题有点错误。我在答案中添加了一些细节。
  • 是的,现在更有意义了,尽管我仍然需要找到一种方法让更新数据库的 PHP 文件与 WebSocket 服务器通信!
  • @Redgie “我在这里假设您的 websocket 服务器是运行 PHP 并进行数据库更新的同一台服务器。” - 这是不同的服务器还是相同的服务器?还是您在 WebSocket 服务器之外的其他地方有数据库更新?如果它们不同,为什么不在 websocket 服务器上进行数据库更新?
  • 是的,它们在同一台服务器上运行。将系统转换为从 websocket 文件中运行所有查询将是一个非常复杂的过程,因为有不同数量的静态和动态生成的查询!
【解决方案2】:

更好的办法是在 PHP 脚本更新数据库时通过服务器端发送通知,这样脚本必须添加 web sockets 的选项才能直接向所有注册的 web socket 客户端发送通知。

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

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

【讨论】:

  • 有趣,这与我的选项 #2 有何不同?
  • 它在很多方面都不同,您说当客户端更新某些内容时,它也会向 websocket 服务器发送通知,但在我的问题中,不需要向服务器发送另一个请求,如果您说的是什么如果连接断开而不是我想告诉您在 js websockets 中有一个触发器,您可以再次调用一个函数来连接 websocket 服务器,就像 gmail 中的 gtalk 一样(当连接断开以再次连接或尝试时,倒计时开始重新连接)。好吧,我才 15 岁,所以我在所有这些方面没有太多经验,好吧
猜你喜欢
  • 2014-06-08
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 2018-01-14
相关资源
最近更新 更多