【问题标题】:MySQL trigger + notify a long-polling Apache/PHP connectionMySQL 触发器 + 通知长轮询 Apache/PHP 连接
【发布时间】:2011-04-12 19:40:39
【问题描述】:

我知道有 Comet 服务器技术可以做到这一点,但我想编写一些简单且本土的东西。

当一条记录被插入到 MySQL 表中时,我希望它以某种方式将这些数据传递给使用 PHP(或其他任何方式)的一系列长轮询 Apache 连接。因此,多人通过他们的浏览器“收听”,并且第二次 MySQL INSERT 发生,它被发送到他们的浏览器并执行。

简单的方法是让 PHP 脚本轮询 MySQL 数据库,但这并不是真正从服务器推送,而是引入了一些不可接受的不必要的数据库查询顺序。我想从 MySQL 获取数据到长轮询连接,基本上不需要侦听器查询。

关于如何实现这一点的任何想法?

【问题讨论】:

    标签: php mysql apache comet long-polling


    【解决方案1】:

    这也是我多年来一直在寻找的东西。我还没有发现 SQL 服务器在 INSERTS、DELETE 和 UPDATES 上推送消息的任何功能。

    TRIGGERS 可以对这些事件运行 SQL,但这在这里没有用。

    我猜你必须构建自己的系统。您可以轻松地从 PHP (Example in first comment) 广播 UDP,问题是 PHP 在服务器端运行并且客户端是静态的。

    我的猜测是,您可以在客户端上运行一个 Java Applet,监听 UDP 消息,然后触发页面更新。

    这只是写作时的一些想法……

    【讨论】:

    • 也许触发器可以写入 memcached 之类的东西,而 PHP 可以轮询?
    • PHP 是静态的,而不是在后台“运行”。关于如何使它显示为“线程”的书上有一些技巧,但接下来的问题是更新客户端页面。我会说轮询必须由 AJAX 完成。轮询上次修改日期(由触发器编写)就足够了。如果它较新,请重新加载页面。
    【解决方案2】:

    我也一直在尝试各种想法来解决这个问题,而取消轮询 sql 查询的唯一方法是轮询文件。如果填充等于 0,则继续循环。如果文件等于 1,则循环运行 sql 查询并发送给用户。它确实增加了另一个级别的复杂性,但我认为这意味着 mysql 的工作量更少,但对于 apache 或任何循环守护程序来说都是一样的。您也可以将命令发送到守护进程“彗星”样式,但它也会根据我所看到的套接字工作原理对每个请求进行分叉和循环,因此希望有人能找到解决方案。

    【讨论】:

      【解决方案3】:

      MySQL 可能不是解决这个问题的正确工具。 Regilero 建议切换您的数据库,但更简单的解决方案可能是使用具有 pub/sub 功能的 redis 之类的东西。

      http://redis.io/topics/pubsub

      【讨论】:

        猜你喜欢
        • 2012-05-02
        • 1970-01-01
        • 2014-01-22
        • 2013-07-02
        • 1970-01-01
        • 1970-01-01
        • 2020-06-06
        • 2014-05-24
        • 2012-04-01
        相关资源
        最近更新 更多