我如何在 php、mysql 和 ajax 的会话中显示用户在线或离线
Posted
技术标签:
【中文标题】我如何在 php、mysql 和 ajax 的会话中显示用户在线或离线【英文标题】:how can i show user online or offline from its session in php,mysql and ajax 【发布时间】:2015-06-20 22:07:17 【问题描述】:请告诉我如何通过访问其会话来显示用户在线或离线。 这是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>
但是这段代码不是根据我的要求运行的,它是根据我每次保存在数据库中的状态在数据库中保存的,然后根据它的行为它给我结果。 我想要什么
-
当用户关闭其浏览器然后逻辑上它的会话被破坏然后我想显示它的离线状态
2.如果用户保持他的会话,那么它的状态是在线
【问题讨论】:
您在代码中哪里使用过该会话 【参考方案1】:没有直接的方法可以做到这一点。没有适当的方法来检测用户是否关闭了他的浏览器。我见过的一种常用来解决这个特定问题的方法 [在您的上下文中] 是使用 posts
表中的 last_activity_timestamp
字段。每次用户进行任何活动时,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 分钟,则他实际上已注销。
【讨论】:
但是如果用户只是阅读了几篇文章而不做任何活动呢? @AmalSurendran 这真的取决于您拥有的网站类型。例如,您可以检查用户是否有 15 分钟处于非活动状态,然后显示“离开”状态。 30 分钟后,如果用户仍处于非活动状态,您可以显示“离线”状态。或者,另一种方法是您可以在 javascript 中设置一个计时器并通知用户他即将注销并且他必须单击一个按钮才能保持登录状态。这些问题可以在业务方面解决逻辑...【参考方案2】:PHP 将每个用户的会话数据存储在服务器上的一个临时文件夹中。该文件夹在 php.ini 配置文件中的变量 session.save_path 下定义。从您的 php.ini 文件中找到此值,或者创建一个 php 文件:
<?php echo "Session Save Path: " . ini_get( 'session.save_path');?>
按照它的内容,然后在浏览器中打开文件。
找到会话数据的保存路径后,打开该文件夹,您会发现一个相当简单的结构。所有会话都以以下格式存储:sess_$SESSIONID。
会话数据在存储到磁盘之前被序列化。因此,存储在会话文件中的对象必须在可用之前进行反序列化。但是,如果您使用按原样存储的纯文本来存储会话数据(例如 $_SESSION['userid'] = 1234)来存储有关用户的信息,那么解析出来应该很容易您要从文件中查找的数据。这将是您获取活动会话并在线设置状态的替代方法。
【讨论】:
但是当会话销毁时它会显示离线状态?? 当会话销毁时,文件中的条目将不可用。与轮询表、轮询文件和更新状态的方式相同。 这看起来像是一个可靠的解决方案。您能否提供有关反序列化会话文件中的信息以显示在页面上的更多详细信息?【参考方案3】:您可以/应该使用 UNIX 时间戳。
这个User online offline status - offline status issue可以更好的显示用户是在线还是离线。
if($time >= $loggedtime)
【讨论】:
【参考方案4】:我写了一小段代码,它对我来说就像一个魅力来更新用户的在线和离线状态。
您所要做的就是在每个页面中调用这两行,(我在主用户页面中使用一个函数并在标题中调用它,然后在每个页面中调用标题)
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");
【讨论】:
【参考方案5】:简单的步骤,只需像这样使用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>
用您的页面更改 text.html 和 setTimeout(startRefresh,2000);价值随心所欲。
对不起我的英语不好
这是完整的源代码
https://www.youtube.com/watch?v=Q907KyXcFHc
【讨论】:
以上是关于我如何在 php、mysql 和 ajax 的会话中显示用户在线或离线的主要内容,如果未能解决你的问题,请参考以下文章