web-dev-qa-db-fra.com

Quel est le moyen le plus simple de déterminer si un utilisateur est en ligne? (PHP/MYSQL)

Puis-je utiliser des sessions pour savoir si l'utilisateur est en ligne?

Ie: utiliser les journaux sur, je définis une variable $ _SESSION, utilisateur multiplie les cookies. Garbage Collector met à jour la base de données pour mettre à jour leur statut en mode hors connexion.

EDIT: Je souhaite une solution qui ne comporte ni heure ni date. Je veux quelque chose à monter sur des sessions ou quelque chose de similaire. Deviner si quelqu'un est en ligne n'est pas suffisant pour ce dont j'ai besoin.

35
MichaelICE

Ne vous embêtez pas pour déterminer les différences entre les fuseaux horaires. Ce n'est pas nécessaire.

Chaque fois que l'utilisateur accède à une page, met à jour un champ dans son enregistrement de la dernière mise à jour du tableau Utilisateurs. Effectuez ensuite une requête pour tous les utilisateurs ayant une heure de dernière mise à jour au cours des 5 dernières minutes. Rien de plus que cela, et ils sont considérés comme "hors ligne".

Si vous utilisez votre serveur-time, via la fonction NOW () de MySQL, vous calculerez les différences entre les fuseaux horaires.

Il s'agit du moyen standard de suivre le nombre d'utilisateurs actuellement en ligne (Signification, actif au cours des dernières minutes).

Constamment mis à jour

Si vous souhaitez savoir qu'ils sont toujours actifs même lorsqu'ils ne sautent pas de page en page, incluez un peu de javascript pour envoyer une requête ping à votre serveur toutes les 60 secondes environ afin de vous informer qu'ils sont toujours en vie. Cela fonctionnera de la même manière que ma suggestion initiale, mais cela mettra à jour vos enregistrements sans les obliger à naviguer sur votre site avec frénésie au moins une fois toutes les cinq minutes.

var stillAlive = setInterval(function () {
    /* XHR back to server
       Example uses jQuery */
    $.get("stillAlive.php");
}, 60000);
85
Sampson

Ce que vous demandez (après la clarification) est, par définition, impossible. HTTP est un protocole sans connexion. Ainsi, dès qu'un utilisateur a affiché une page et que tout le contenu est renvoyé du serveur au navigateur de l'utilisateur, il n'y a plus de connexion entre les deux. Quelqu'un est "en ligne" avec votre site web pendant moins d'une seconde. 

Une des choses que vous pourriez faites est d’avoir JavaScript sur votre page Web et envoyez régulièrement AJAX demandes à votre serveur, y compris des informations d’identification et un autre AJAX. _ demande quand l'utilisateur quitte la page, en utilisant window.onbeforeunload .

5
dj_segfault

Mon chemin n’est peut-être pas le meilleur, mais comme mon site et ma base sont entièrement dans la base de données mysql, lorsqu'un utilisateur se connecte à mon site, 

  1. Je mets à jour le tableau des utilisateurs pour dire qu'ils Sont en ligne
  2. Insérez-les dans une table en ligne
  3. Ensuite, je règle une session avec l'heure

Ensuite, à chaque chargement de page, je vérifie la session en ligne; si elle existe, je vérifie son âge, si elle a moins de 5 minutes, je ne fais rien, si elle a plus de 5 minutes, je mets à jour l'heure de la session à nouveau avec l'heure actuelle et mettre à jour la table des utilisateurs en ligne avec l'heure

Ensuite, j'ai un travail cron qui s'exécute toutes les 10 à 15 minutes et qui supprime toute utilisation de la table en ligne et marque sa table utilisateur comme étant hors ligne si son temps en ligne a été mis à jour dans un délai de X minutes.

4
JasonDavis

Il semble que votre logique de comparaison "est la personne en ligne" ne prend pas en compte les fuseaux horaires. Si vous traitez des fuseaux horaires de cette manière, je vous recommande fortement de stocker toutes vos heures au format GMT et de les convertir en heure locale pour vos utilisateurs juste avant de les afficher. Cela rendra les opérations de comparaison très simples.

Il y a un joli fil SO sur les fuseaux horaires ici .

2
zombat

Une chose que je conseillerais est de stocker ce type d’informations en mémoire avec par exemple memcached ou mysql heap ou redis. Sinon, la base de données sera touchée beaucoup.

2
Alfred

Stockez le fuseau horaire dans la table et utilisez-le dans un calcul pour trouver l'heure locale de l'utilisateur par rapport à l'heure locale de l'utilisateur qui visualise la page.

Modifier:

Mieux encore, stockez toutes les heures comme heure du serveur et basez tous les calculs relatifs uniquement à l'heure du serveur.

1
Ian Elliott

La solution que j’ai implémentée pour cela consiste à définir, à chaque chargement de page par un utilisateur authentifié, une variable memcache telle que "user_ {userid} isonline" => true et l’expirer dans 5 minutes. Ensuite, vérifiez si la var est dans le cache lorsque j'accède aux informations de l'utilisateur. Selon la taille de votre base d'utilisateurs, si vous souhaitez obtenir une liste de toutes les personnes en ligne, vous pouvez utiliser un appel memcache getmulti avec un tableau de clés "user {userid} _isonline" pour tous vos utilisateurs.

bien sûr, cela dépend vraiment de la fréquence à laquelle un utilisateur changera de page sur votre site ... pour obtenir une représentation plus précise des utilisateurs en ligne, vous pouvez implémenter un appel ajax xmlhttprequest sur votre page qui s'exécute à un intervalle réduit (30 secondes ou moins). so) qui réinitialise la memcache var et fait expirer la memcache var en moins de temps (1 minute pour prendre en compte les éventuels problèmes de navigateur). Ce n’est pas COMPLÈTEMENT exact, mais comme http n’a pas de connexion permanente au serveur, vous êtes assez limité dans ce que vous pouvez faire.

SI vous avez besoin d’une seconde représentation de qui est en ligne, vous pourriez peut-être charger une application flash sur votre page qui se connecte à un serveur Jabber, puis vérifier si cet utilisateur est connecté au serveur.

0
Jason

Selon votre situation, il peut être préférable de créer une table distincte "dont-en ligne" avec les colonnes: "ip" et "dernière mise à jour" et d'interroger/mettre à jour cette table chaque fois qu'un utilisateur charge une page.

Les requêtes de chargement de page peuvent inclure :

  1. Mettre à jour/insérer le tableau "dont-en ligne" pour l'utilisateur actuel basé sur ip.
  2. Supprimez les lignes "expirées" (vous pouvez également utiliser périodiquement cronjob).
  3. Comptez les utilisateurs "actifs".

Avantages de l'utilisation de cette technique :

  1. Si un utilisateur n'est pas connecté, il est toujours en cours de comptage/suivi.
  2. Dépend du nombre d'utilisateurs que vous avez, interroger cette table peut être plus rapide.

Remarque: Si vous utilisez cette option, tenez compte du fait que toute page visualisée créera une ligne dans votre tableau. Vous pouvez donc, en vous basant sur useragent, ignorer les robots ou ne compter que les plus populaires (Firefox, IE, Safari, Opera, etc.).

0
GiladG

Vous pouvez également utiliser la balise onunload ... Sur le corps Plus d'informations ici ( https://www.w3schools.com/jsref/event_onunload.asp )

De cette façon, vous n'avez pas à attendre 4 à 5 minutes pour que l'utilisateur soit déconnecté.

Mais vous devriez toujours utiliser la méthode de mise à jour ajax en cas de blocage du navigateur de l'utilisateur ... 

0
Raja Bilal

Voici un moyen d'obtenir la différence entre deux dates d'une base de données en quelques minutes, puis vérifiez la différence et définissez le statut En ligne/Hors ligne. 

$query = 'SELECT * FROM Users';
$result = mysqli_query($mysqli, $query);

foreach($result as $user){
    // date from the database
    $dbLastActivity = date("d-m-Y h:i:s a", strtotime($user['lastOnline']));
    // date now
    $now = date("d-m-Y h:i:s a", $date);

    // calculate the difference
    $difference = strtotime($now) - strtotime($dbLastActivity);
    $difference_in_minutes = $difference / 60;

    // check if difference is greater than five minutes
    if($difference_in_minutes < 5){
        // set online status
        $updateStatus = 'UPDATE Users SET Status="online" WHERE lastOnline="'.$user['lastOnline'].'"';
    } else {
        // set offline status
        $updateStatus = 'UPDATE Users SET Status="offline" WHERE lastOnline="'.$user['lastOnline'].'"';
    }

    // check if mysqli query was successful
    if (!$mysqli->query($updateStatus)){
        printf("Error Message %s\n", $mysqli->error);
    }
} 
0
Syno