【问题标题】:Update database on browser close在浏览器关闭时更新数据库
【发布时间】:2015-03-19 07:22:58
【问题描述】:

我正在创建一个网站,我希望能够看到谁在线,谁不在线。查看谁在线并不难,当你登录时,数据库中的“在线”字段从0变为1。但问题在于离线。我设法做到了 IF 该人在注销按钮上注销并被重定向到 logout.php 页面:

<?php
session_start();
$user_check=$_SESSION['login_user'];

if(session_destroy())
{
$connection = mysql_connect("localhost", "root", "");
$db = mysql_select_db("masterrad", $connection);

$query2 = mysql_query("update users set online = '0' where username = '$user_check'", $connection);

header("Location: index.php");
}
?>

但如果他只是关闭页面,数据库中不会有任何变化,因为他从未访问过 logout.php 页面。

所以我想知道是否有更好的方法来做到这一点?

【问题讨论】:

  • 会话将/应该自动删除自己,这取决于您如何设置服务器的会话寿命。更新,好吧,那是另一回事。谷歌“如果浏览器关闭则更新数据库”。你会发现很多结果。
  • 这是一个糟糕的主意,但是您可以拥有一个“心跳”系统,在该系统中每 x 分钟发送一个 ajax 请求。如果您没有收到答复,请标记为离线。
  • 是的,“心跳”一个糟糕的主意。
  • 例如,这个答案stackoverflow.com/a/1658474可能很好地回答了你的问题和zulius.com/how-to/close-browser-connection-continue-execution
  • 出于好奇,为什么心跳系统在这里被如此强烈地拒绝?我遇到过许多使用该范例的生产站点。

标签: php mysql sql session logout


【解决方案1】:

在您认为是“在线”页面的每个页面上。
您可以使用“last_time_spotted”字段的@Alec Deitloffs 想法,并根据该字段和您的时间段更新在线标志。不需要 cron。

$query2 = mysql_query("update users set `online` = '0' where `online` = '1' AND (`last_time_spotted` < NOW() - INTERVAL 15 MINUTE), $connection);

【讨论】:

    【解决方案2】:

    我相信,大多数网站执行此操作的方式是在数据库中设置“最后一次发现”字段。每次用户进入新页面时,该字段都会为他们更新为当前时间。一个 cron 作业将每 10 分钟、15 分钟执行一次(无论您想要什么),如果当前时间减去用户上次被发现的时间大于您想要的阈值(即七分钟不活动),那么您会考虑使用它们离线。

    当用户离开页面、关闭浏览器等时,实际上让代码完全且成功地执行是非常非常困难的。不幸的是,这意味着需要采取替代方法,据我了解,这是最受欢迎的选择。或者至少是实现起来比较简单的一种。

    【讨论】:

    • 我使用的是 Windows,而我所看到的 cron 是用于 linux 的?还是我完全错过了重点?
    • This question 讨论了建立定时/重复操作的替代方案。基本上,您只想在服务器上建立一些东西来运行每 X 个时间单位,这将为“非活动用户”执行数据库扫描并将它们转换为“已离职用户”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多