从Javascript运行PHP文件以检查在线用户:表示未登录的用户是

从Javascript运行PHP文件以检查在线用户:表示未登录的用户是,javascript,php,mysql,ajax,session,Javascript,Php,Mysql,Ajax,Session,我写的只是一个简单的管理面板,但想让登录的用户看到其他登录的用户。为此,我有一个sessions MySQL表,其中包含活动会话(登录用户)和一个PHP文件,该文件将在所有页面上每隔几秒钟使用JavaScript更新每个活动用户的时间戳(因此它将仅在活动时更新,并将删除大于30秒前的会话)。以下是代码: Javascript: <script type="text/javascript"> function track() { var url = "tracking.php?user

我写的只是一个简单的管理面板,但想让登录的用户看到其他登录的用户。为此,我有一个sessions MySQL表,其中包含活动会话(登录用户)和一个PHP文件,该文件将在所有页面上每隔几秒钟使用JavaScript更新每个活动用户的时间戳(因此它将仅在活动时更新,并将删除大于30秒前的会话)。以下是代码:

Javascript:

<script type="text/javascript">
function track() {
var url = "tracking.php?username=<?PHP echo $_SESSION['username']; ?>";
xmlReq=new XMLHttpRequest();
xmlReq.open("GET",url,true);
xmlReq.send();
}
setInterval(function(){track();}, 3000);
</script>

函数跟踪(){
var url=“tracking.php?username=”;
xmlReq=新的XMLHttpRequest();
open(“GET”,url,true);
xmlReq.send();
}
setInterval(函数(){track();},3000);
PHP:所以url应该是tracking.PHP?username=john.doe

<?PHP
$username=$_GET['username'];
if($username){
$result = mysql_query("SELECT * FROM sessions WHERE username='$username'");

if(mysql_fetch_array($result) !== false){
mysql_query("UPDATE sessions SET time=now() WHERE username='$username'");
} else {
mysql_query("INSERT INTO `sessions` (`username`, `time`) VALUES ('$username',now())") or die (mysql_error());
}
mysql_query("DELETE FROM sessions WHERE time < (now() - 30);");
}
?>

看起来您的Java脚本正在获得缓存响应。
禁用PHP文件上的缓存

在php中使用标题:

<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?>


能否尝试在“选择”菜单上使用SQL NO CACHE并报告结果?这里有更多信息:我还建议每3秒钟发送一次请求似乎有些过分。有很多用户,这会带来麻烦。如果您决定对响应执行任何操作,请不要介意客户端的处理。感谢Askanison4,无论如何我都会执行nocache并延长时间。您是否尝试添加其他部分以删除“online”类:@mali303这是一个好位置。哦,你应该试试这个。@ColumKelly你试过那个修复方法吗?我也同意3秒的超量杀戮。它不会与许多在线用户同时工作。确保对你的应用程序进行压力测试。我试着像你一样输入代码,但似乎不起作用。我尝试将脚本随机运行的时间设置为1/2分钟,我让它打开了10分钟,它似乎工作了,因为此时只有我自己登录。因此,根据经验,我最好在加载PHP时检查sessions表,然后以更长的时间间隔运行检查?为什么不在一个查询中获得整个在线/离线状态?单独查询每个用户是不好的做法。通过查询数据库并返回当前在线/离线用户列表,更改算法以每30秒获取所有用户在线/离线状态。
<script type="text/javascript">
function checklogin(username) {
var element = "status";
newusername = username.substring(0, username.indexOf('.'));
newelement = element + newusername;
$.ajax({
url: ‘check.php?username='+username,
type: "GET",
dataType: "html",
success: function(data)
{
if(data === "Online")
{
document.getElementById(newelement).innerHTML='<div class="online"></div>';
}
}
});
}
</script>
<?PHP
$sql=mysql_query("SELECT * FROM tbl_admin_users order by id ASC");
$num=mysql_num_rows($sql);
$i=0;
while($num>$i){
$id=mysql_result($sql,$i,"id");
$username=mysql_result($sql,$i,"username");
$first_name=mysql_result($sql,$i,"firstname");
$last_name=mysql_result($sql,$i,"lastname");
$jobtitle=mysql_result($sql,$i,"jobtitle");
$email=mysql_result($sql,$i,"email");
$phone=mysql_result($sql,$i,"phone_office");
$spanar=explode(".",$username);
$spanid=$spanar[0];
?>

<tr>
<td class="center" width="40px">
<script type="text/javascript">
setInterval(function(){checklogin('<?PHP echo $username; ?>');}, <?PHP echo rand(2000,4000); ?>);
</script>
<span id="status<?PHP echo $spanid?>"></span>
</td>
<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?>