【发布时间】:2012-11-08 13:37:49
【问题描述】:
在没有使用pusher 进行管理员交互的情况下,如何将mysql 数据库更改推送到管理屏幕?
pusher 可以运行某种侦听器以在mysql 上进行更改,还是pusher 简单地进行某种花哨的轮询?
总而言之,如何对这样的设置进行编码?
非常感谢您提供一个简单的示例或链接。
【问题讨论】:
在没有使用pusher 进行管理员交互的情况下,如何将mysql 数据库更改推送到管理屏幕?
pusher 可以运行某种侦听器以在mysql 上进行更改,还是pusher 简单地进行某种花哨的轮询?
总而言之,如何对这样的设置进行编码?
非常感谢您提供一个简单的示例或链接。
【问题讨论】:
⚠️ 警告!这可能会导致您的数据库变慢。考虑到每个插入的 sys exec'ing curl,这将引入相对较差的性能。最好还有一个触发器将消息写入另一个表并让另一个进程在循环中检查新行。
MySQL 使通过存储过程将您的编码包装成易于访问的 TRIGGERS 变得简单。你可以用 pusher 创建类似的东西,我知道如何用 PubNub 来做;所以这里是 PubNub 和 MySQL 的快速指南。简单是您所追求的,这就是您的解决方案!我将引导您通过一种简单的方法将您表上的任何 UPDATE、INSERT 和 DELETE 操作绑定到将被调用的存储函数时间,使用 PubNub 轻松地向您的移动和网络应用发送推送通知。
DELIMITER $$
CREATE PROCEDURE push_message
(p1 DOUBLE,
p2 DOUBLE,
p3 BIGINT)
BEGIN
DECLARE cmd CHAR(255);
DECLARE result CHAR(255);
SET cmd = CONCAT('curl https://pubsub.pubnub.com/publish/demo/demo/0/mysql_triggers/0/%22',p1, ',' ,p2, ',' ,p3,'%22');
SET result = sys_eval(cmd);
END$$;
注意:确保您的 PROCEDURE 类型是正确的 DOUBLE 或 VARCHAR 或 TEXT。
CREATE TRIGGER push_message_trigger AFTER INSERT ON your_table_name_here
FOR EACH ROW
CALL push_message(NEW.Column1, NEW.Column2, NEW.Column3);
注意:确保在推送消息中包含您需要的列。
CREATE TRIGGER push_message_trigger AFTER UPDATE ON your_table_name_here
FOR EACH ROW
CALL push_message(NEW.Column1, NEW.Column2, NEW.Column3);
http://www.pubnub.com/console?sub=demo&pub=demo&channel=mysql_triggers - 您可以通过 PubNub 开发控制台观看您的触发器。通过这种方式,您可以了解您需要更改哪些参数,以及哪些数据对您来说很重要,这些数据对您来说是重要的,这些数据可以包含在 PubNub websocket 可以接收的每个推送通知中,以及移动和 Web 设备上的更多内容。
<div id=pubnub ssl=on></div>
<script src=//pubnub.a.ssl.fastly.net/pubnub-3.4.5.min.js></script>
<script>(function(){
PUBNUB.init({
subscribe_key : 'demo',
ssl : true
}).subscribe({
channel : 'mysql_triggers',
callback : function(mysql_trigger_details) {
alert(mysql_trigger_details);
}
});
})();</script>
现在您已经掌握了通过简单程序直接从 MySQL 发送和接收 更改事件 所需的步骤。还有一些方法可以优化此方法,例如向将 HTTPS 推送通知排队和汇集的守护进程发出信号。这应该很有效。
【讨论】:
在 MySQL 中,这需要一个带有轮询循环的管理应用程序。
如果您为其设计 MySQL 架构,轮询循环可能会很便宜。它可以查询感兴趣的表以获取最新的时间戳或最新的行 ID。
但它仍然需要轮询。
【讨论】:
您有多种选择。最常见的是在更改数据库时在应用程序层处理此问题。这当然意味着您需要在代码中更新数据库的奇异点,这并不总是可能的。但是,如果可能的话,我会推荐这个解决方案。
轮询是另一种选择,但显然不太实时。您只需编写一个脚本来检查这些条件并在情况发生变化时调用推送器 API。
另一种可能性是将 MySQL 触发器与自定义插件一起使用,这样您就可以在数据库更改时立即调用 Pusher API。这是迄今为止最复杂的解决方案,我不会真正推荐它。部分原因见this question的第一个回答。
【讨论】: