Quelle est la manière la plus simple de déterminer si un utilisateur est en ligne? (PHP / MYSQL)

Y a-t-il une façon de faire des séances piggy pour savoir si l'utilisateur est en ligne?

C'est-à-dire: utilisez les connexions, j'ai configuré une variable $ _SESSION, un cookie de dépassement d'utilisateur. Le récupérateur de déchets met à jour la base de données pour mettre son statut hors connexion hors connexion.

EDIT: Je souhaite une solution qui n'implique pas les dates et les heures. Je veux que quelque chose sorte sur des sessions ou quelque chose de similaire. Deviner si quelqu'un est en ligne n'est pas assez bon pour ce dont j'ai besoin.

Ne vous inquiétez pas de trouver les différences entre les fuseaux horaires. Ce n'est pas nécessaire.

Chaque fois que l'utilisateur accède à une page, mettez à jour un champ dans son enregistrement de la table des utilisateurs dernière mise à jour. Ensuite, faites une requête pour tous les utilisateurs ayant une dernière mise à jour dans les 5 dernières minutes. Quelque chose de plus, et ils sont considérés comme «hors ligne».

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

C'est la manière standard de suivre le nombre d'utilisateurs actuellement en ligne (ce qui signifie, actif au cours des quelques dernières minutes).

Mise à jour constante

Si vous souhaitez savoir qu'ils sont toujours actifs, même s'ils ne sautent pas d'une page à l'autre, incluez un peu de javascript pour faire un ping sur votre serveur toutes les 60 secondes pour vous faire savoir qu'ils sont toujours en vie. Cela fonctionnera de la même manière que ma suggestion d'origine, mais il mettra à jour vos enregistrements sans exiger qu'ils naviguent frénétiquement sur votre site au moins une fois toutes les cinq minutes.

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

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

Une chose que vous pourriez faire est d'avoir JavaScript sur votre page Web pour que les requêtes AJAX soient régulièrement transmises à votre serveur, y compris des informations d'identification et une requête AJAX différente lorsque l'utilisateur quitte la page en utilisant window.onbeforeunload .

Mon chemin peut ne pas être le meilleur moyen, mais puisque mon site et ma base d'utilisateur sont tous dans mysql DB, lorsqu'un utilisateur se connecte sur mon site,

  1. Je met à jour la table utilisateur pour dire qu'elle est en ligne
  2. Insérez-les dans une table en ligne
  3. Ensuite, j'ai configuré une session avec l'heure actuelle

Ensuite, sur chaque charge de page, je vérifie la session en ligne, si elle existe, je vérifie l'âge, si elle est inférieure à 5 minutes, je ne fais rien, si elle est plus ancienne que 5 minutes, puis je met à jour Le temps de la session à nouveau avec l'heure actuelle et met également à jour la table des utilisateurs en ligne avec le temps

Ensuite, j'ai un travail cron qui s'exécute toutes les 10 à 15 minutes qui supprime toutes les utilisations de la table en ligne et marque la table utilisateur hors ligne si l'heure en ligne a été mise à jour dans X quantité de minutes

Il semble que votre logique de comparaison "est la personne en ligne" ne tient pas compte des fuseaux horaires. Si vous rencontrez des fuseaux horaires de cette façon, je vous recommande vivement de stocker tous vos horaires dans GMT et de les convertir à l'heure locale pour vos utilisateurs avant de les afficher. Cela rendra les opérations de comparaison très simples.

Il y a un bon sujet sur les fuseaux horaires ici .

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

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

Modifier:

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

Dépend de votre situation, il est préférable de créer une table séparée «en ligne» avec les colonnes: «ip» et «dernière mise à jour de l'heure» et interrogez / mettez à jour cette table chaque fois qu'un utilisateur charge une page.

Les demandes de chargement de page peuvent inclure :

  1. Mettre à jour / insérer la table "dont" en ligne "pour l'utilisateur actuel en fonction de l'adresse IP.
  2. Supprimez les lignes "expirées" (peut également être effectuée périodiquement à l'aide de cronjob).
  3. Comptez les utilisateurs "actifs".

Avantages de l'utilisation de cette technique :

  1. Si un utilisateur n'est pas connecté, il est toujours compté / suivi.
  2. Dépend de la quantité d'utilisateurs que vous avez, demander ce tableau peut être plus rapide.

Remarque: Si vous utilisez cela, vous devriez prendre en considération que toute page vue créera une ligne dans votre table de sorte que, en fonction de l'utilisateur, vous ne pouvez pas ignorer les robots ou compter les populaires (Firefox, IE, Safari, Opera, etc.).

La solution que j'ai mise en œuvre pour cela consiste à, sur chaque chargement de page par un utilisateur authentifié, définir / réinitialiser un memcache var tel que "user_ {userid} isonline" => true et l'expirer en 5 minutes. Ensuite, vérifiez si la var est dans le cache lorsque j'habite sur les informations de l'utilisateur. En fonction de la taille de votre base d'utilisateurs, si vous souhaitez obtenir une liste de tous les utilisateurs en ligne, vous pouvez utiliser un appel getmulti memcache avec un ensemble 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 pages 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 s'exécutant à un petit intervalle (30 secondes ou Donc) qui réinitialise le memcache var et que le memcache var expire en moins de temps (1 minute pour tenir compte des problèmes possibles du navigateur). Ce n'est pas COMPLETEMENT précis, mais comme http n'a pas de connexion persistante au serveur, vous êtes assez limité sur ce que vous pouvez faire.

Si vous avez besoin de la deuxième représentation de qui est en ligne, vous pourriez avoir une application Flash chargée dans votre page qui se connecte à un serveur jabber, puis vérifiez si cet utilisateur particulier est connecté sur le 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 ne devez pas attendre 4 à 5 minutes pour que l'utilisateur puisse être hors ligne.

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