一个解决方案可能是每次页面加载或每个页面的 ajax 请求将代码反弹到服务器以说“嘿,此用户在线”,然后在您的脚本中添加一个内置函数 (可以在任何页面上工作,任何人都可以查看)以检查 mysql 更新时间是否在最后 X 分钟内,如果不是,则假定用户已注销。
我想我已经解释得很糟糕了。
您的表中有一个时间戳字段 - 与每个登录的用户相关联,如果上次更新的时间戳在现在的 X 分钟内,则他们被视为在线,
因此,每次加载页面或每次处理 ajax 调用时,都会更新 timstamp 字段,然后在时间戳早于 X 分钟的任何字段上,这是因为他们(可能)已注销因此它们在数据库中被更改为“离线”。虽然如果他们只是忙并且仍然在线,也许实际上不要将他们注销,只需将他们标记为离线。
我没有详细说明您如何处理数据库内容详细信息等,所以我的想法可能与您可以创建的内容完全不同 - ?
编辑:
Ajax 建议
要让 ajax 每 X 秒作用于每个页面,请将以下 ajax 写入成员所在的页面,注意末尾的数字是毫秒,600000 = 10 分钟。所以使用了 500000,因为它在时间范围内。所以 ajax 函数每 8.5 分钟运行一次,或者在页面加载时运行。
ajax 写得很糟糕,可能还可以改进。但应该工作。您需要研究更优化的 ajax 脚本。
浏览器页面:
<script src="js/jquery-1.11.1.min.js" type="text/javascript" ></script>
<script type="text/javascript">
$( document ).ready(function() {
var memberId = <?php print $memberId; ?>;
var securityKey = <?php print some security key code or suchlike to validate this ajax at the otherend;?>;
setInterval(function(){
$.post("/ajaxSession.php",{
MemberId: memberId,
somesecuritykey: securityKey
});
}, 500000);
});
</script>
AJAX 页面:
请注意,在这种情况下,更新时间是一个“时间戳”MySQL 字段。
<?php
/**
Setup this page as if any other PHP page but this page will never show to the browser,
AJAX data is supplied as $_POST and inn this case $_POST['somesecuritykey'] and $_POST['MemberId']
**/
session_start();
/**
include classes and files
**/
if (is_numeric($_POST['MemberId'])){
$memid= (int)$_POST['MemberId'];
/**Also include your security stuff here **/
$sql = "UPDATE Members SET UpdateTime = NOW() , LoggedIn = 'YES' WHERE MemberId = ? LIMIT 1"
$mysqli = new mysqli();
$mysqli->prepare($sql);
$mysqli->bind_param("i",$memid);
$mysqli->execute();
}
这应该保持时间戳值是最新的,所以登录的人是更新时间大于 time()-601(10:01 分钟)的任何人,SQL 列表可以在任何人发生的任何标题/类上更改它访问任何页面
SQL = "UPDATE Members SET LoggedIn = 'NO' WHERE UpdateTime < (NOW() - INTERVAL 10 MINUTE)"