【问题标题】:update database on browser exit在浏览器退出时更新数据库
【发布时间】:2026-02-01 00:00:03
【问题描述】:

如果用户退出浏览器或导航离开页面,有人知道如何更新 mysql 数据库吗?我将值设置为 1,并希望在这种情况下将其设置为 0。几周以来,我一直在用头撞墙,任何帮助都将不胜感激,谢谢。我正在使用 PHP。我已经在身体卸载时尝试过,但它并没有达到我想要的效果。

【问题讨论】:

  • I have a value set to 1 and want it setting to 0 in such an event. -- 您是否使用此值来检查在线/离线用户?
  • 为什么onUnload 不适合你?这听起来正是您正在寻找的。​​span>
  • @eykanal:大多数浏览器不允许在(之前)卸载期间发送 ajax 请求,并且在某些(较差的)浏览器中,您有竞争条件:异步 ajax 请求是否在窗口关闭之前发送?您绝对不想在(之前)卸载期间发送 ajax 请求。

标签: php html css


【解决方案1】:

不要那样做。仅仅因为您依赖浏览器向您发送通知(通过beforeunload 事件)或其他一些机制。如果浏览器崩溃,或者用户让他的计算机进入睡眠/休眠状态会发生什么?

您可以考虑其他选项,例如 PING!浏览器可以每隔 1 分钟左右通过 Ajax 调用发送的方法,告诉他他还活着。您需要做的就是创建一个 MySQL 过程,该过程将扫描任何超过 1:30 分钟的“活动”条目(调用 last_seen TIMESTAMP 或其他东西)并将其设置为“活动”为 0。这个过程可以在随机请求中调用(很像 PHP 会话清理机制)。

这将确保用户仍然在那里,因为您将获得 PING!定期请求并且当用户停止时,您将能够安全地说他不会 PING!不再(虽然它会导致轻微的延迟,但可以接受)。这也将确保用户安全。

【讨论】:

    【解决方案2】:

    PHP 只能在访问页面时更改内容。从 PHP 的角度来看,脚本一结束,事务就结束了,与该页面无关。

    做到这一点的唯一方法是保持连接打开,脚本运行,并使用这样的东西:

    <?php
    
      function shutdown()
      {
         // here you change the value on your db...
      }
    
      register_shutdown_function('shutdown');
    
     // send the data to client
      echo "anything";
      flush();
      // sleep for a lot of time... 99999 seconds...
      sleep(99999);
    ?>
    

    【讨论】:

    • 一些虚拟主机会在几秒钟后“杀死”PHP 进程(例如 1and1 上的 25),所以这是不切实际的。另外,对于少数用户来说可能没问题,但这也会引发洪水攻击......