Question

Je vais avoir du mal à comprendre comment je peux compter le nombre d'utilisateurs connectés dans mon application.

Ce que je: Lorsqu'un utilisateur se connecte, ils obtiennent une session (qui est utilisé lorsque l'utilisateur souhaite accéder à une page protégée) et la colonne IsLoggedIn pour l'utilisateur dans la table des utilisateurs est mis à 1 pour indiquer que l'utilisateur est connecté. Lorsque l'utilisateur se déconnecte, la valeur est définie à 0. Compter le nombre de 1 dans la table des utilisateurs, il est facile de retourner le nombre d'utilisateurs connectés. Mais ...

Le problème: Si l'utilisateur ferme le navigateur sans se déconnecter, la valeur de la base de données reste 1, ce qui indique que l'utilisateur est toujours connecté, même si leur session a pris fin quand ils ont fermé le navigateur .

Question: pourrait-il quelqu'un suggérer une bonne façon de le faire

Était-ce utile?

La solution

Au lieu d'une colonne IsLoggedIn, vous devez ajouter une colonne LastTimeSeen. Chaque fois qu'une personne visite une page que vous mettez à jour la colonne:

UPDATE members SET LastTimeSeen = NOW() WHERE id = $the_user_id

Alors pour obtenir combien de personnes sont sur le site à tout moment vous utilisez la requête:

SELECT COUNT(*) FROM members WHERE LastTimeSeen > DATE_SUB(NOW(), INTERVAL 5 MINUTE)

Cela montre combien de personnes ont vu une page dans les 5 dernières minutes, ce qui est le meilleur que vous allez obtenir sans une solution beaucoup plus compliquée.

Autres conseils

Juste pour proposer une autre solution:

if ($user->isLoggedIn()) {
  touch("/writable/path/loggedInUsers/" . $user->id);
}

Si vous n'avez pas besoin d'interroger ces données, une touche de fichiers local est beaucoup plus rapide qu'une écriture de DB. Journaliser utilisateurs, analyser le répertoire FILEMTIMES sous N secondes vieux.

En raison de la façon dont notre site est construit, il était nécessaire d'utiliser l'approche ajax. J'utilise jQuery donc il est relativement indolore.

Ces lignes sont entrés dans le $ (document) fonction .ready.

fnShowImOnline();
setInterval('fnShowImOnline', 120000);

Ceci est la fonction javascript ...

function fnShowImOnline() {
    $.get('ajax/im_online.php');
}

Et voici le PHP

<?php
    session_start();
    if ((isset($_SESSION['user']))&&($_SESSION['authorized']=='authorized')) {
        include('../includes/db.php');
        db_connect();
        mysql_query("UPDATE members SET last_checked_in = NOW() WHERE user_id = {$_SESSION['user']['user_id']}");
    }

?>

Le compte est PHP droite / mySQL.

//  Members online.
$online_sql = "SELECT COUNT(*) FROM members where last_checked_in > DATE_SUB(NOW(), INTERVAL 5 MINUTE)";
$online_RS = mysql_query($online_sql);
$online_row = mysql_fetch_row($online_RS);
$online = $online_row[0];

Pour toutes les fois que je dois mettre à jour les numéros de manière dynamique, ce bit de paiement ajax fait l'affaire.

$.ajax({
    url: 'ajax/members_online.php',
    dataType: 'json',
    success: function(response) {
        if (!isNaN(response.total)) {
            $('#OnlineTotal').html(response.total + " Total ");
            $('#OnlineOnline').html(response.online +  " Online Now");
        }
    }
})

en utilisant cela pour PHP / mySQL

//  Members online.
$online_sql = "SELECT COUNT(*) FROM members WHERE last_checked_in > DATE_SUB(NOW(), INTERVAL 5 MINUTE)";
$online_RS = mysql_query($online_sql);
$online_row = mysql_fetch_row($online_RS);
$online = $online_row[0];
//  Members total.
$total_sql = "SELECT COUNT(*) FROM members";
$total_RS = mysql_query($total_sql);
$total_row = mysql_fetch_row($total_RS);
$total = $total_row[0];
$response = json_encode(array('total'=>$total,'online'=>$online));
echo($response);

Cela fonctionne bien pour nous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top