使用 php 监控 mysql 更改 **无需**轮询
Posted
技术标签:
【中文标题】使用 php 监控 mysql 更改 **无需**轮询【英文标题】:using php to monitor mysql changes **WITHOUT** polling 【发布时间】:2011-06-27 21:42:25 【问题描述】:我看到了许多与我提出的问题类似的问题。 他们中的一些人说可以轮询,这不会显着影响数据库性能,有些人仍然没有得到答复。我想知道的是:
我可以做一些类似于 ASP.NET 的 sqldependency 的事情,它有助于找出何时对数据库进行了更改无需轮询。 我知道轮询是可以的,可能不会影响数据库性能,但我需要在更新后立即知道更新,所以我觉得我需要比仅仅每 1 秒轮询一次更好的东西。 作为附加点,必须将在服务器上检测到的更新推送(Ajax 推送 - 我正在使用 Ajax 推送引擎)到订阅特定频道的所有客户端。感谢和问候, Thothathri Srinivasan
【问题讨论】:
如果你真的想要它完全没有轮询,根据定义,当发生变化时,你必须让 mysql 守护进程向你的监听应用程序发出信号。如果你的定义不那么纯粹,其他解决方案也是可能的:一个小型的本地守护进程,它监视二进制日志、数据库表文件、触发器集合...... 【参考方案1】:Redis 发布订阅
我希望triggers 可以帮助您,但经过一番检查后,我(非常)怀疑。
您可以使用Redis pubsub 实现您的目标。 Redis 是一个非常快的data structure server。将数据库更改发布到频道,并让感兴趣的客户通过订阅同一频道(实时)检测更改。
Downloading/Installing Redis 非常简单,作为额外奖励,您还将“获得一个开源的高级键值存储。它通常被称为数据结构服务器,因为键可以包含字符串、散列、列表、集合和排序集。”
安装它可能是最好的方法,但如果你不能,你可以使用免费的http://redistogo.com 计划与 Redis 服务器通信,但限制是你只能获得 5MB 来存储数据并且它不会被持久化到光盘上。
【讨论】:
任何类型的消息队列都应该能够服务于相同的目的(beanstalk、AMQ、RabbitMQ 等) 它可以,但在我看来,pubsub 比消息队列更能解决这个问题,因为我们可以/可能有多个侦听器。 我查看了 Redis Pub/Sub。毫无疑问,它非常令人印象深刻,我正在使用 APE 来做同样的事情。问题不在于发布/订阅频道。问题是,当对数据库进行更改时,我想了解相同的内容,而不必每 5 秒轮询一次。我没有使用 php 在数据库中进行更改。有一个通用数据库,三个公司中的任何一个都可以更改。我需要知道何时进行更改,而不必轮询,因为更改的频率有时是 5 秒,有时只有一周。对那个 Alfred n Frank Farmer 有什么想法吗? 或者***.com/questions/1467369/…【参考方案2】:您可以将服务器推送与 websockets 或 comet 等实现结合使用。
【讨论】:
我知道这样做,但我只想在数据库本身发生更改时收到通知。 @wittythotha -- 所以将它添加到后端并且只在更新时发送推送 @Neal - 我想我应该更清楚一点 - 好的,所以任何人都可以随时更新数据库。如果我有两个或多个组织正在使用的数据库,其中一个决定更新,我希望其他组织了解这一点。话虽如此,主要组织可能会每周更新一次,有时会更频繁,有时会在 5 秒内更新。如果我投票,我会做很多不需要的工作,那么有没有办法让其他两个组织知道数据库的变化?然后我可以推送到这两个组织的频道。 你可以让php搜索更新文件,如果有任何新条目则推送新信息 嗯...好吧,基本上我也必须轮询该更新文件,对吗?所以它与轮询数据库相同......【参考方案3】:我喜欢 Alfred 的 pubsub 想法。我会将数据库视为插入事件的订阅者,而不是规范版本。也许这对于您现有的代码库是不可能的。您可能还可以监视数据库服务器上的二进制日志以观察变化并将此信息推送给订阅者。
【讨论】:
【参考方案4】:我认为 Q4M 正是您想要的 http://q4m.github.com/tutorial.html
【讨论】:
以上是关于使用 php 监控 mysql 更改 **无需**轮询的主要内容,如果未能解决你的问题,请参考以下文章
statistics:使用 PHP + Swoole 实现的统计监控系统
如何在不刷新php页面的情况下跟踪mysql数据库中的更改?