通过php会话变量检查特定用户是否在线

时间:2012-05-11 22:36:30

标签: session

我目前正在尝试使用php会话变量在我的网页上显示所有在线用户。为此,每当用户登录或注销时,数据库中的列都将设置为“在线”或“离线”。但是,这并不完全有效,因为当用户关闭浏览器时数据库不会更新(并因此破坏会话)。 那么是否有另一种方法来检查是否设置了某个sessionid?

目前我正在设置这样的会话:

session_start();

$_SESSION['username']="Example Username";

要从当前用户页面检查是否存在会话变量集,我们只需使用:

if(isset($_SESSION['username']))
{
//username is set
}

但是如果我们需要检查特定用户是否在线,我们如何获得已设置的所有会话变量的数组? e.g。

//Get all $_SESSION['username'] vars

//loop through array and check for specific $_SESSION

for($i=0; ... )
{
  if( $_SESSION['username'][$i] == "User 1" )
  {
  //do something
  }
}

从我到目前为止所读到的所有内容来看,似乎没有办法在你的页面上获得所有会话的数组。 那么是否有更好的方法,例如facebook,twitter等如何处理这些东西? 谢谢你的帮助!

3 个答案:

答案 0 :(得分:4)

一种解决方案是在数据库中存储时间戳,以及记录用户上次访问任何网站资源的在线/离线标记。然后你可能会在15分钟或其他一些常数值后将它们视为脱机。

另一个解决方案是在这里使用回调http://php.net/manual/en/function.session-set-save-handler.php,我认为你可以处理gc回调并在数据库中设置离线标志。

如果您在class SessionDBhere的该页面上进行搜索,则看起来有人已经在自定义类中实现了某些版本!

答案 1 :(得分:0)

您可以使用简单的更新查询

例如,您有一个表用户,并且您有一个名为status(在线/离线)的列

在您的login.php上使用

<?php
//your user verification code
if(variable that holds your sql query){
$user_status=('UPDATE user SET status= online WHERE email="'your user email selector'")
}

然后在注销时执行类似的脚本只需将在线值更改为离线

答案 2 :(得分:-1)

你可以试试这个:

foreach ($_SESSION as $sessionKey => $sessionValue)
{
  if( $sessionKey == 'username' ) && ( $sessionValue == 'User 1' )
  {
  //do something
  }
}