如何在php,mysql和ajax的会话中显示用户在线或离线

时间:2015-04-15 04:58:07

标签: php jquery mysql ajax session

请告诉我如何通过访问其会话来显示用户在线或离线。 这是php和mysql查询

header('Content-Type: application/json');
$array = array();

$res = mysql_query("SELECT * FROM `posts` WHERE status=1");
if(mysql_num_rows($res) > 0){
    while($row = mysql_fetch_assoc($res)){  
        $array[] = $row['user_id'];  // this adds each online user id to the array         
    }
}
echo json_encode($array);

我试试这段代码这是js文件

<script type="text/javascript">    
   $(document).ready(function() {                               
     setInterval(function(){
      $.ajax({
           url: 'status.php',
           dataType: "json",
           type: 'GET',
           success: function(data) {
               if (data.length > 0){  // if at least 1 is online
                  $('.status').each(function(){  // loop through each of the user posts
                      var userid = parseInt($(this).attr('id').replace('user','')); // get just the userid #
                      if($.inArray(userid, data) !== -1){  // if userid # in the returned data array set to online
                           $(this).css({background: 'green'});  
                      } else{  // else if userid # not in the returned data array set to offline
                           $(this).css({background: 'grey'});  
                      }
                  });
               } 
               else { // if no one is online, set all to offline
                   $('.status').css({background: 'grey'});
               }

           }
        });
    }, 2000); //2s just for testing. Set to 15s when code fully works.
   });
 </script>

但是这个代码不是根据我的重新运行而根据我在数据库中保存的数据运行每次我在DB中保存我的状态然后根据它的行为它给我结果。 我想要什么

  1. 当用户关闭其浏览器,然后逻辑上其会话被销毁,然后我想离线显示其状态
  2. 2.如果用户维持其会话,则其状态为在线

5 个答案:

答案 0 :(得分:5)

没有直接做到这一点afaik。没有正确的方法来检测用户是否已关闭其浏览器。我见过的一种常用于在[上下文]中解决此特定问题的方法是使用last_activity_timestamp表中的posts字段。每次用户执行任何活动时,都会使用新时间更新last_activity_timestamp

$res = mysql_query("UPDATE `posts` SET last_update_timestamp = NOW() WHERE user_id = {$currentUserId};");

然后在您的代码中检查用户当前是否在线,您还可以检查自用户上次活动以来是否已经过了某个时间段(例如20分钟),如下所示:

$res = mysql_query("SELECT * FROM `posts` WHERE status=1 AND TIMESTAMPDIFF(MINUTE, last_activity_timestamp, NOW()) > 20;");

如果用户的最后一项活动超过20分钟,那么他就会被有效注销。

答案 1 :(得分:2)

PHP将每个用户的会话数据存储在服务器上的临时文件夹中。此文件夹在变量session.save_path下的php.ini配置文件中定义。从php.ini文件中找到此值,或者使用以下命令创建一个php文件:

<?php echo "Session Save Path: " . ini_get( 'session.save_path');?>

作为内容,并在浏览器中打开文件。

找到会话数据的保存路径后,打开该文件夹,你会发现一个相当简单的结构。所有会话都以以下格式存储:sess_ $ SESSIONID。

会话数据在存储到磁盘之前被序列化。因此,存储在会话文件中的对象在被使用之前必须被反序列化。但是,如果您使用按原样存储的纯文本来存储会话数据(例如$ _SESSION ['userid'] = 1234)来存储有关用户的信息,则应该很容易解析出来您要从文件中查找的数据。这将是您获得活动会话并在线设置状态的替代方案。

答案 2 :(得分:0)

您可以/应该使用UNIX时间戳

User online offline status - offline status issue可以更好地显示用户在线或离线。

if($time >= $loggedtime)

答案 3 :(得分:0)

我写了一些代码,这些代码对我来说就像一个魅力,可以通过在线和离线更新用户的状态。

你需要做的就是在每个页面中调用这两行,(我在主用户​​页面中使用一个函数并在标题中调用它,然后在每个页面中调用标题)

    mysqli_query($con, "UPDATE users SET status = 'offline' WHERE TIMESTAMPDIFF(MINUTE, lastactive, NOW()) > 1 AND username = '$username' LIMIT 1");
    mysqli_query($con, "UPDATE users SET status = 'online' WHERE TIMESTAMPDIFF(MINUTE, lastactive, NOW()) < 1 AND username = '$username' LIMIT 1");

答案 4 :(得分:0)

简单的步骤,只需使用javascript这样的页面调用

<!DOCTYPE html>
<html>
<head>
    <title>Autorefresh Browser using jquery</title>
    <script type="text/javascript" src="jquery.min.js"></script>
    <script type="text/javascript">
        $(function() {
            startRefresh();
        });
        function startRefresh() {
            setTimeout(startRefresh,2000);
            $.get('text.html', function(data) {
                $('#viewHere').html(data);
            });
        }
    </script>

</head>
<body>
    <div id="viewHere"></div>
</body>
</html>

用页面和setTimeout(startRefresh, 2000 )更改 text.html ;随心所欲。

对不起,我的英语不好

这是完整的来源

https://www.youtube.com/watch?v=Q907KyXcFHc