Bonjour à tous,
J'essaie de mettre en place un système "en ligne" et "hors ligne". Mais je galère un peu sur un truc.
Décrivez ici votre code ou ce que vous cherchez à faire
Lorsqu'une personne se connecte, je mets à jour la table connexion pour dire qu'elle est connectée ("En ligne"). Et lorsqu'elle se déconnecte au clic sur le bouton "Se déconnecter", je fais pareil pour dire qu'elle est "Hors ligne". Et cela fonctionne très bien. Mais le truc c'est que tout le monde ne clique pas forcement sur le bouton "Se déconnecter" pour se déconnecter. Certains ferment simplement le navigateur! Et vu qu'aucune mise à jour n'est faite sur la base de données en ce moment là, le système indique que la personne est toujours en ligne, alors que sa session a été détruite automatiquement par PHP.
Y'a t'il un moyen pour lancer une requête à la base de données au moment de la destruction de la session par PHP ou que me proposez-vous pour gérer cela s'il vous plaît. Merci
Bonjour.
Cette question a déja été posé plusieurs fois et pour répondre à ta question, non.
Il te faut faire un système toi même, tu peux par exemple te baser sur la proposition faite sur le sujet suivant : Savoir si un utilisateur est connecté.
Salut,
J'ai simplement une question : Pourquoi utiliser une BDD pour vérifier si un utilisateur est en ligne ou non plutôt que tout juste les sessions ? Ne serait-ce pas plus simple d'utiliser uniquement les sessions ?
c'est effectivement les sessions qu'on utiliiserait pour ce genre de cas... mais bon chaqu'un son genie
Bonsoir.
Concernant Roak et Lionel Bah, non, vous n'avez pas compris ce qu'il veut faire.
Il ne cherche pas juste à dire à l'utilisateur s'il est connecté ou non, mais par exemple à pouvoir lister tous les utilisateurs et indiquer s'ils sont connecté ou non.
Salut
Il semblerait que ce soit plus ou moins faisable en AJAX avec beforeunload
.
Je dis "plus ou moins" parce-qu'il semble y avoir des problèmes.
source :
http://stackoverflow.com/questions/9701734/how-to-execute-ajax-function-onbeforeunload
Salut,
Pour ton systéme tu peux définir un champ "Last_activity" et définir après combien de temps sans activité ton utilisateur est défini comme "déconnecté'"
Ah ouais,
mais du coup ça serai quoi une "activité" ?
le chargement d'une page peut-être ?
Mais sur un tchat, on peut tchater longtemps sans jamais rafraichir, du coup il faudrait surtout mettre "envoyer un message" dans le tchat, comme une "activité" aussi.
Le champ "last_activity" serait en datetime
, et à chaque "activité" tu réécris la date courante, en format "strtotime" en base de données.
Et quand la date enregistré en base de données à un écart de... plus de 15 min disons (écart avec la date-heure-minute courante), alors l'utilisateur en question est considéré comme "déconnecté".
Mais maintenant il faut un moyen de "lire" cette valeur enregistré dans "last_activity".
Quel est "l'évênement" qui va "déclencher" cette comparaison en base de données ?
Comment on peut faire ça ?
Est-ce que ça existe un genre de "crontask" pour MySQL ?
[EDIT]
Je me rends compte que ce n'est pas un genre de "SQL crontask" qu'il faudrait, mais plutôt un genre de "PHP crontask".
Effectivement, si on update JUSTE la base de données, le site ne va pas se rafraichir tout seul.
Donc pour faire un genre de "PHP crontask", on pourrait penser à ce genre de chose :
<?php
while (true)
{
// Vérifie le champ last_activity de chaque utilisateurs, et modifie le champ connected en fonction.
// Refait une requête SQL pour aller lire quels sont les nouveaux connectés/déconnectés
sleep(15 * 60);
}
?>
Le problème c'est que sleep
va mettre TOUT le site en pause.
Ce n'est pas bon.
Du coup il faudrait peut-être essayer ce genre de choses :
<?php
$echo_time = time();
$interval = 15 * 60;
while (true)
{
if ($echo_time + $interval >= time())
{
// Dans cette partie, on vérifie en base de données... modifie en fonction... et fait la reqête SQL pour lire
// C'est ici que sur ton site, tu affiches la listes des connectés/déconnectés
$echo_time = time(); // Réinitialise le "compteur" pour que la boucle fonctionne
}
}
?>
Hello tout le monde! Merci pour votre attention et votre promptitude. En effet Roak et Babio, comme l'a signifié Lartak, je ne cherche pas juste à informer l'utilisateur qu'il est connecté ou pas. Mais plutôt les autres utilisateurs. Pour le moment, je me debrouille avec la méthode "LastActivityTime" comme l'a indiqué fabricelepro.
Je lance une fonction Ajax Jquery toute les 30 secondes pour mettre à jour le statut connecté("LastActivityTime") de l'utilisateur. C'est pas le top du top j'avoue mais au moins ça a le merite de marcher. Rire :)
Du coup, pour savoir si une personne est en ligne ou pas je fais une requête sur la base de données pour savoir si la différence entre la date de maintenant(NOW()) et son "LastActivityTime" est supérieur à 2min.
PHP ET SQL // Requête pour mettre à jour LastActivityTime de la session
$query = $db->prepare("UPDATE session_users SET LastActivityTime =NOW() WHERE etat='En ligne' AND user=? LIMIT 1");
if ($query->execute([$user])) {
return true;
}
else {
return false;
}
PHP ET SQL // Requête pour vérifier si l'utilisateur est en ligne ou pas.
$query = $db->prepare("SELECT * FROM session_users WHERE user=? AND etat='En ligne' AND TIMESTAMPDIFF(MINUTE, LastActivityTime, NOW())<=2 LIMIT 1");
$query->execute([$user]);
$result = $query->fetch();
if (!empty($result)) {
echo "L'utilisateur est en ligne";
}
else {
echo "L'utilisateur est hors ligne";
}