Php 如何计算会话数以显示站点上已登录用户的总数

Php 如何计算会话数以显示站点上已登录用户的总数,php,jquery,html,css,session,Php,Jquery,Html,Css,Session,我希望在我的网站上显示登录的在线用户,如会员在线:102。我没有找到一个完美而简单的方法来解决这个问题。是否有会话计数方法或任何其他方法来实现此结果。在登录和注销时,我可以通过在数据库表中使用0和1列来实现这一点,但当用户直接关闭浏览器并退出会话时,这并没有帮助。这才是真正的问题。请帮我怎么做。对于任何情况,我只是分享我的登录和注销脚本 注销脚本 <?php session_start(); if(isset($_SESSION["zoranelogin"])){

我希望在我的网站上显示登录的在线用户,如
会员在线:102
。我没有找到一个完美而简单的方法来解决这个问题。是否有会话计数方法或任何其他方法来实现此结果。在登录和注销时,我可以通过在数据库表中使用0和1列来实现这一点,但当用户直接关闭浏览器并退出会话时,这并没有帮助。这才是真正的问题。请帮我怎么做。对于任何情况,我只是分享我的登录和注销脚本

注销脚本

<?php  
    session_start();
    if(isset($_SESSION["zoranelogin"])){
        unset($_SESSION["zoranelogin"]);    
        header("Location: login.php");  
    }
?> 

登录脚本

<?php 
session_start();
if(isset($_SESSION['zoranelogin'])){
    header('Location: dashboard.php');
}
include'config/db.php'; 
$msg = null; 
$date = date('Y-m-d H:i:s');

$uname  = (!empty($_POST['uname']))?$_POST['uname']:null;
$pass   = (!empty($_POST['pass']))?$_POST['pass']:null;
$mpass  = (!empty($_POST['pass']))?md5($_POST['pass']):null;

if(isset($_POST['login'])){
    $chklogin = "SELECT * FROM members WHERE mem_uname = :uname AND mem_pass = :pass";
    $chklogiq = $pdo->prepare($chklogin);
    $chklogiq->bindValue(':uname', $uname);
    $chklogiq->bindValue(':pass', $mpass);
    $chklogiq->execute();
    $checklgn = $chklogiq->rowCount();
    $fetch = $chklogiq->fetch();

    if($checklgn > 0){
        session_start();
        $_SESSION['zoranelogin'] = $fetch['mem_id']; 
        header("Location: dashboard.php");      
    }else{
        $msg = "<div class='message-error'>Username and Password are incorrect. Please try again!</div>";
    }
}
?>

无法检测关闭的浏览器。了解站点上有多少用户的最好方法是通过会话来完成。当您在文件系统上使用会话时,这非常困难,因为您必须打开所有文件并读取它们。所以

最好的方法是将会话保存在数据库中。您可以在登录时为会话设置用户id,并在注销时将其删除。然后,您可以使用一个简单的mysql计数脚本来计算一个用户的所有会话

这里有一个关于如何在数据库上进行会话的教程链接

你还有一个问题。当用户关闭浏览器时,您将看不到这一点。这是因为客户端不发送消息。我现在走了。这就是为什么我们有一个会话超时。你可以将超时时间缩短到2分钟,但如果有人阅读一页超过2分钟,他就会被踢。您可以使用ajax脚本每分钟更新一次会话来补偿这一点,但这将占用大量服务器流量/内存。这就是为什么不建议这样做


建议:将会话设置为数据库,超时时间为20分钟。当有人关闭浏览器时,你最多20分钟都看不到它。

你是在数据库还是文件系统上进行会话?文件系统…然后从文件中读取,这将非常困难。更新了一点问题。。请再读一遍,伙计们。如果用户连续活动超过20分钟怎么办?在20分钟的时间里,他还会被踢吗?这并没有解决我的疑问,但我现在还是有了这样做的想法。一种非官方的方法,可能逻辑不那么冷静,但可以做到……)20分钟后不行。在session_start()上,会话处理程序将执行SessionHandler::gc($maxlivetime)。此功能将清除系统上的所有非活动会话。查看更多信息。