自动检测数据库表是否更改

Auto detect if DB table changes

本文关键字:是否 数据库 自动检测      更新时间:2023-09-26

我有一个小应用程序,用户可以在其中将任务拖放到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_idstatus_id并执行PDO更新查询,以更新我的数据库。如果查询正确执行,我

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

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

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

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

所以我的问题是;如果对数据库表进行了更改,如何使应用程序自动降级?以及如何在不刷新页面的情况下更新 HTML 表。

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

那么,是的,我使用的最佳实践是什么?

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

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

当 websocket 客户端连接到 Node.js 服务器时,它会告诉服务器它要监视哪些数据,然后,一旦收到 Redis 事件并且事件的数据与客户端的监视数据匹配,就会通过 websocket 通知客户端,然后客户端将刷新页面。

看看这个问题,其中的答案详细解释了所有这些,包括可以重用的示例代码。

我会使用 ajax 以合理的间隔检查服务器。什么是合理的取决于你的项目 - 它应该足够频繁,它在一端进行更改,不要搞砸另一个用户正在做的事情。

如果您担心这是资源密集型的,您可以使用APC为所有活动内容保存上次修改时间 - 这样,当您只是检查是否有任何更改时,您就不必访问数据库。

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

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

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

  1. 进行观察(事件侦听器)模式实施,或使用现有的模式之一。
  2. 当发生任何有意义的事情时触发事件。
  3. 订阅此活动