在php中,如何检测用户是否已注销?

在php中,如何检测用户是否已注销?,php,mysql,session,redirect,logout,Php,Mysql,Session,Redirect,Logout,用户成功登录后,我将login=true存储在数据库中。但是,如何通过关闭浏览器而不单击“注销”按钮来检查用户是否已注销?另外,我如何将10分钟不活动的用户重定向到登录页面 我正在使用php和mysql。任何帮助都将不胜感激 编辑: 对不起,我的问题不清楚。我确实使用会话来存储他们是否登录。但是,现在我想将这些信息存储在数据库中,以便在其他页面上显示它们的状态。假设user1有3个朋友。当显示他的所有好友时,user1想知道他的好友是在线还是离线。这就是我想要的。有什么建议吗?最好将login=

用户成功登录后,我将login=true存储在数据库中。但是,如何通过关闭浏览器而不单击“注销”按钮来检查用户是否已注销?另外,我如何将10分钟不活动的用户重定向到登录页面

我正在使用php和mysql。任何帮助都将不胜感激

编辑:
对不起,我的问题不清楚。我确实使用会话来存储他们是否登录。但是,现在我想将这些信息存储在数据库中,以便在其他页面上显示它们的状态。假设user1有3个朋友。当显示他的所有好友时,user1想知道他的好友是在线还是离线。这就是我想要的。有什么建议吗?

最好将login=true存储在会话变量中,以检查用户是否登录。这将解决您的大部分问题;)

通常情况下,您会将此类信息放入会话中

$_SESSION['user'] = "A user name";
然后,当您想注销时,请执行以下操作:

session_destroy();

关于会话和a的更多信息。

为什么不使用会话或cookie,而不是将其插入数据库中呢。
您可以使用setcookie()函数设置Cookie,也可以使会话变为可用并将值存储在其中。

您会发现使用会话监视登录状态更好


2017年编辑:如今,您最好的选择是使用WebSocket跟踪页面/站点上的状态


您无法检测用户何时关闭浏览器或何时使用PHP离开您的站点,而且这样做的JavaScript技术远不能保证是无用的

相反,您的最佳选择最有可能存储每个用户的最后活动时间

  • 在用户表中沿“last_activity”行创建一列
  • 每当用户加载页面时,将其上次的_活动更新到当前时间
  • 要获得在线用户的列表,只需查询数据库中最近10/20分钟以上的上次_活动值的用户

如果您试图跟踪“联机”的用户,那么您可以考虑为单个用户使用会话,而不是在DB中存储Calue= Trand以显示其状态给用户或其他人,为用户存储最后一个活动时间。当您调出在线用户列表时,请创建sql查询以仅返回在过去10分钟内具有“last_activity”的用户。

a好的,您无法检查某人何时关闭浏览器窗口(或离开您的页面转到另一个页面)因此,您需要按照上面其他人的建议检查活动。

您想知道是否可以检测到用户是否关闭了浏览器。您可以使用javascript,但我不会依赖它(因为javascript很容易禁用),但您不能使用PHP,因为PHP只在您请求页面时运行。当页面打开时不会


为了安全起见,您应该跟踪用户的最后一次活动,如果已经过去几分钟(5/10),则假设该用户已离开。如果他再次做某事(例如6分钟后),那么他将重新联机。

存储用户每个活动的时间戳。如果时间超过10分钟,请注销

在PHP中,您可以执行以下操作:

session_start();
if (!isset($_SESSION['LAST_ACTIVITY'])) {
    // initiate value
    $_SESSION['LAST_ACTIVITY'] = time();
}
if (time() - $_SESSION['LAST_ACTIVITY'] > 3600) {
    // last activity is more than 10 minutes ago
    session_destroy();
} else {
    // update last activity timestamp
    $_SESSION['LAST_ACTIVITY'] = time();
}

可以在数据库上执行相同的操作。在那里,你甚至可以得到“当前”在线用户的列表。

这是“”之前所说内容的扩展

让用户定期ping服务并告知他们仍在登录。在会话中存储上次ping时间。如果最后一次ping会话大于所述时间,则再次ping以告知使用仍然有效

在数据库中存储收到ping的时间。如果接收到的最后一个ping是KEEPLIVE阈值,那么考虑用户已经离开了站点。 下面是一些未经测试的示例代码。您可以使用“PING\u FREQUENCY”来控制用户活动更新最后一个\u活动列的频率

define(PING_FREQUENCY,300); //5 mins
if (($_SESSION['lastPingTime'] + PING_FREQUENCE) > time()) {
    stillLoggedIn(); //execute a function to tell that the user is still logged in
}

function stillLoggedIn() {
    //Do SQL update to mark the last activity time for the user
}

IMHO最好的方法是在每次更新用户记录时将最后一个活动时间戳存储在DB中。注销或超时后(使用cronjob维护超时),只需将其设置为零值并用作标志

$user = new User($user_id);
$user->logged_in = (bool)($last_activity > 0);

有时候你需要说smth。像“上次出现在…”,然后离开上次活动,只需在用户表中添加一个登录的布尔标志(tinyint)。

您可以通过多种方法来实现这一点,我猜最多2种,对于上次活动中遇到的问题,您可以将其与使用jQuery检查不活动相结合,即在一段时间内没有鼠标或键盘事件,比如说10到20分钟,一旦确认空闲时间,就可以对一个php文件进行ajax调用,该文件将更新显示用户脱机的数据库表

您可以从以下内容开始:

<script type="text/javascript">
idleTime = 0;
$(document).ready(function () {
//Increment the idle time counter every minute.
var idleInterval = setInterval(timerIncrement, 60000); // 1 minute

//Zero the idle timer on mouse movement.
$(this).mousemove(function (e) {
    idleTime = 0;
});
$(this).keypress(function (e) {
    idleTime = 0;
});
});

function timerIncrement() {
idleTime = idleTime + 1;
if (idleTime > 19) { // 20 minutes
    $.ajax({
     url: 'update_user.php',
     type: 'POST',
     datatype: 'json',
     data: someData
    });
}
}
</script>   

空闲时间=0;
$(文档).ready(函数(){
//每分钟增加一次空闲时间计数器。
var idleInterval=setInterval(timerIncrement,60000);//1分钟
//将鼠标移动时的空闲计时器归零。
$(this).mousemove(函数(e){
空闲时间=0;
});
$(此)。按键(功能(e){
空闲时间=0;
});
});
函数timerIncrement(){
空闲时间=空闲时间+1;
如果(空闲时间>19){//20分钟
$.ajax({
url:'update_user.php',
键入:“POST”,
数据类型:“json”,
数据:someData
});
}
}

我知道。但是如果用户关闭浏览器呢?我的数据库仍然保持状态是真的吗?我想显示用户是联机还是脱机。状态应为datetime,然后每次用户执行某项操作时,您都可以更新此字段。如果用户在过去半小时内一直处于活动状态,您可以说他已登录。或类似情况。这是否适用于多个用户?如果我想列出10个用户,想检查10个用户是否在线,怎么做。。我知道,如果最后一个活动超过10分钟,我会重定向到一个php页面,告诉我的数据库这个用户已经注销了?这就是你的意思吗