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

StackOverflow https://stackoverflow.com/questions/1051895

  •  20-08-2019
  •  | 
  •  

Question

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

I.e: utiliser les journaux sur, je définis une variable $ _SESSION, l'utilisateur multiplie les temps de cookie. Garbage Collector met à jour la base de données pour mettre à jour son statut hors ligne.

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.

Était-ce utile?

La solution

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 écarterez les différences de temps 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 s'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 à parcourir 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);

Autres conseils

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 & Quot; en ligne & Quot; avec votre site web pendant moins d'une seconde.

Une des choses que vous pouvez faire est que JavaScript sur votre page Web envoie régulièrement des requêtes AJAX à votre serveur, qui incluent des informations d'identification, ainsi qu'une requête AJAX différente lorsque l'utilisateur quitte la page. , en utilisant window.onbeforeunload .

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 la table des utilisateurs pour dire qu'ils sont en ligne
  2. Insérez-les dans une table en ligne
  3. Ensuite, je configure une session avec le heure actuelle

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 est plus ancienne que 5 minutes, puis-je mettre à jour l'heure de la session à nouveau avec l'heure actuelle et met également à 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 la table utilisateur comme étant hors ligne si l'heure en ligne a été mise à jour dans un délai de X minutes

On dirait que votre "ient est la personne en ligne " la logique de comparaison 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 dans 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 existe un fil de discussion so sur les fuseaux horaires ici .

Une chose que je conseillerais est de stocker cette information en mémoire avec par exemple memcached ou mysql heap ou redis. Sinon, la base de données sera très sollicitée.

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 consultant la page.

Modifier:

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

En fonction de votre situation, il peut être préférable de créer un tableau séparé & "; dont-en ligne &"; avec les colonnes: " ip " et " last-updated-time " et interrogez / mettez à 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 " dont-en ligne " table pour l'utilisateur actuel basée sur ip.
  2. Supprimer " expiré " rangées (peut également être effectué périodiquement à l’aide de cronjob).
  3. Compte & "Actif &" utilisateurs.

Avantages de l'utilisation de cette technique :

  1. Si un utilisateur n'est pas connecté, il est toujours en cours de comptage / suivi.
  2. Selon le nombre d'utilisateurs que vous avez, l'interrogation de 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. Par conséquent, basé sur useragent, vous pouvez ignorer les bots ou ne compter que les plus populaires (Firefox, IE, Safari, Opera, etc.). ).

La solution que j’ai implémentée pour cela consiste à définir / réinitialiser une variable memcache telle que " user_ {userid} isonline " = > vrai et expire 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 & Quot; utilisateur {userid} _isonline & Quot; clés 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 petit intervalle ( Environ 30 secondes) qui réinitialise la memcache var et font 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 très 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 dans votre page qui se connecte à un serveur Jabber, puis vérifier si cet utilisateur est connecté au serveur.

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 se déconnecte.

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

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);
    }
} 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top