使用MySQL数据库更改发送WebSocket更新效率更高

时间:2013-11-01 11:02:30

标签: javascript php mysql websocket phpwebsocket

我目前正在尝试使用WebSockets,以减少/消除在潜在低带宽环境中对持续AJAX请求的需求。所有设备都符合WebSocket,因此没有问题,我正在尝试将其保留到本机PHP WebSockets,没有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通知,这可能吗?

2 个答案:

答案 0 :(得分:1)

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

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


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

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


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

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

答案 1 :(得分:1)

更好的答案是在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

现在这更容易/更方便/带宽保护。