【问题标题】:Auto detect if DB table changes自动检测数据库表是否更改
【发布时间】:2015-01-13 06:38:13
【问题描述】:

我有一个小型应用程序,用户可以在其中将任务拖放到 HTML 表中。

当用户放弃任务时,我调用了一个名为update_task的javascript函数:

function update_task(user_id, task_id, status_id, text, uiDraggable, el) {
  $.get('task_update.php?user_id='+user_id+'&task_id='+task_id+'&status_id='+status_id+'', function(data) {            
    try {
      jsonResult = JSON.parse(data);
    } catch (e) {
      alert(data);
      return;
    };

在 task_update.php 我得到我的价值观; user_idtask_id & status_id 并执行 PDO UPDATE 查询,以更新我的数据库。如果查询正确执行,我

echo json_encode ( array (
            'success' => true 
) );

然后我将任务附加到正确的表格单元格

if(typeof jsonResult.success != 'undefined') {
  $(uiDraggable).detach().css({top: 0,left: 0}).appendTo(el);
}

这一切都很好。但是,我开始意识到,当 2 个或更多人同时进行更改时,这是一个问题。如果我正在使用 2 个浏览器进行测试,并且在这两个浏览器上都打开了站点,例如:然后,如果我在 browser1 上移动任务,我将不得不在 browser2 上手动刷新页面以查看更改。

所以我的问题是;如果对 DB 表进行了更改,我如何使我的应用程序自动解除技术?以及如何在不刷新页面的情况下更新 HTML 表格。

我查看了一些更新页面的时间间隔,但这对我不起作用,因为我真的不想强制浏览器刷新。例如,用户还可以在灯箱 iframe 中创建新任务,因此如果他们在尝试创建新任务时刷新浏览器,这对他们来说会非常烦人。

是的,对我来说最好的做法是什么?

【问题讨论】:

  • 自动检测并在它发生后用它做什么?如果这是问题所在,您可能可以实现 MySQL 的 TRIGGER。
  • hmmm...使用ajax代替刷新页面并相应地修改任务?
  • 据我所知,websockets 是在不响应请求的情况下将数据从服务器推送到客户端的唯一方法。也就是说,您可能会选择“间隔刷新”并使用 ajax 来完成......虽然这是一个非常昂贵的解决方案,因为这意味着很多无用的请求。
  • EventSource 可能是要走的路。 docs
  • 您应该使用long polling 来检查您的应用程序中的实时更改。你可以看到here an implementation in php

标签: javascript php pdo


【解决方案1】:

我会使用 ajax 以合理的时间间隔检查服务器。什么是合理的取决于你的项目——它应该经常改变,不要弄乱另一个用户正在做的事情。

如果您担心这会占用大量资源,您可以使用 APC 保存所有活动的最后修改时间 - 这样您在检查是否有任何更改时不必访问数据库。

当事情发生变化时,您也应该使用 ajax,并使用 javascript/jquery 直接在页面中添加更改。

【讨论】:

    【解决方案2】:

    如果您确实需要检查数据库更改 - 编写数据库触发器。

    但是如果除了你的代码之外没有人改变它 - 你可以在你的代码中实现一些观察。

    1. 实现 Observation(EventListener) 模式,或使用现有模式之一。
    2. 当任何有意义的事情发生时触发事件。
    3. 订阅此活动

    【讨论】:

      【解决方案3】:

      使用Redis 及其publish/subscribe 功能在您的PHP 应用程序和轻量级websocket 服务器之间实现消息总线(Node.js 是一个不错的选择)。

      当您的 PHP 修改数据时,它还会在 Redis 中发出一个事件,表明某些数据已更改。

      当一个websocket客户端连接到Node.js服务器时,它告诉服务器它想监控什么数据,然后,一旦接收到Redis事件并且该事件的数据与客户端监控的数据匹配,通知客户端通过 websocket,然后刷新页面。

      查看this question 的答案,其中详细解释了所有这些内容,包括您可以重复使用的示例代码。

      【讨论】:

        猜你喜欢
        • 2016-06-07
        • 1970-01-01
        • 2014-10-29
        • 1970-01-01
        • 2019-03-27
        • 2013-02-18
        • 2018-12-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多