7
votes

Comment voir si un utilisateur est en ligne sur un site Web avec les bases de données pilotées PHP et MySQL?

Je construis un site Web communautaire. Les utilisateurs se connecteront et se déconnecteront comme habituellement.

J'utilise l'état d'attribut en ligne / hors ligne pour définir le statut de l'utilisateur. Mais que se passe-t-il si un utilisateur clique simplement sur le bouton X ou déconnecte autrement sans vous déconnecter?

Dernièrement, mon ordinateur s'est écrasé, quand j'ai ouvert le site avec mon ordinateur portable, je ne pouvais pas vous connecter car je ne permet pas de vous connecter à deux endroits. Je vais à phpmyadmin et je vois mon statut encore en ligne. Y a-t-il une solution pour cela.

J'ai essayé la chose activée Last_Time, mais cela ne fonctionne pas en cas d'accident d'ordinateur! Et il n'y avait rien ni interactivité ni rafraîchir pour mettre à jour la table.


0 commentaires

13 Réponses :


0
votes

Vous êtes sur le bon chemin: Enregistrer la dernière fois la dernière activité de l'activité dans la base de données et, lorsque quelqu'un accède au site, définissez le statut hors ligne pour les utilisateurs qui n'étaient pas actifs pendant 15 minutes ( ou moins). Si l'utilisateur est connecté et que son statut est défini sur hors ligne dans la base de données, forcer à vous déconnecter (détruire la session).

Cependant, la vraie question est la suivante: ça vaut la peine? Je n'ai pas encore vu aucun système d'authentification similaire.


9 commentaires

Hey quelque chose que je ne comprends pas est. Les bases de données sont-elles capables de compter ou de voir les utilisateurs Last_activity sans interaction utilisateur? Ou dire si un utilisateur ne fait rien sur la base de données. La base de données compte-t-elle le temps seul et s'il voit que l'utilisateur n'a pas été actif pour la moitié de notre pour mettre à jour la table et définir le statut sur Offline? Peut-il arriver sans interaction utilisateur. Si oui, je peux utiliser des bases de données pour voir la dernière_activité et mettre à jour la table sans l'interaction utilisateur


Non, une base de données elle-même ne peut pas détecter l'activité de l'utilisateur. Vous devez mettre à jour le champ dans la table des utilisateurs de chaque demande à une page de votre site. Ce serait plus facile si vous aviez un contrôleur avant. Est-ce que tu?


J'ai partagé l'hébergement. Je ne peux pas non plus installer de contrôleur qui fera le travail en arrière-plan. Comment ils font cela? Comment font les forums du conseil d'affichage? Comment d'autres sites font cela? Il doit y avoir une chose à faire cela. Et si un utilisateur éteint simplement le PC. Quoi alors? Comment puis-je mettre à jour la table. :(


"Contrôleur avant" signifie que l'accès de l'utilisateur qu'une seule page de votre site et que le script PHP s'occupe de la réponse appropriée. Par exemple, /index.php?page=foo au lieu de /foo.php . De cette manière, vous pouvez placer le code pour mettre à jour l'activité de l'utilisateur uniquement dans le fichier index.php et non dans le fichier foo.php .


Non je ne fais pas ça. J'utilise des cours et plus d'Ajax pour faire la plupart des choses. Mais hé, veuillez lire ceci -> Et si un utilisateur ferme simplement le PC? Il n'y a pas d'interaction rien de tout simplement rien. Comment vais-je mettre à jour ma table?


Lorsque le prochain visiteur accède au site, votre script PHP détruira automatiquement la session s'il n'y avait aucune activité pendant 15 minutes.


Comment puis-je détruire la session d'autres utilisateurs? Avec ce nouvel utilisateur? Je ne fais vraiment pas de dessous. Comment mettre à jour l'état de cet utilisateur d'un autre utilisateur?


Par "Détruire la session", je veux dire définir le statut hors ligne dans la base de données.


D'accord maintenant je comprend. Lorsque nouvel utilisateur vient sur mon site. Je dois programmer un script qui vérifiera tout l'attribut Last_ACTIVITY sur ma table et voir si la dernière_activité était avant 30 minutes, puis mettez à jour l'attribut Status à Offline. Ensuite, chaque utilisateur va sur mon site ce script fonctionnera également pour obtenir la dernière_activité. Avec cela, je peux mettre à jour la ligne de tout utilisateur par d'autres utilisateurs. Je l'ai maintenant je vais essayer ceci



19
votes

Vous n'avez pas besoin du drapeau en ligne / hors ligne, il vous suffit de sauvegarder le dernier temps d'activité. Lors de l'affichage du statut de l'utilisateur, si le dernier temps d'activité est inférieur à + 15 minutes, l'utilisateur est en ligne, hors ligne, sinon.


0 commentaires

-1
votes

Selon votre scénario, vous pouvez utiliser la logique ci-dessous pour vérifier l'état de l'utilisateur:

au lieu de vérifier si l'utilisateur est en ligne ou hors connexion uniquement dépendant de la valeur de la colonne Table, utilisez la variable de session comme bien. Par exemple, considérez ci-dessous le code: P>

 <?php

  $stauts_from_table_column;

  if($stauts_from_table_column==1 && isset($_SESSION['userid']))
  {
   $user_logged_in = true;
  }
  else
  {
   $user_logged_in = false;
  }     

?>


2 commentaires

Les gens veuillent lire ma question. Comment puis-je mettre à jour la table sans interaction utilisateur. Et si un utilisateur ferme simplement l'ordinateur ??? Il n'y a pas d'interaction pour mettre à jour le tableau rien de rien. Et maintenant ?


@AYGETA pour la mise à jour automatique de la base de données, vous pouvez exécuter travail cron sur le serveur qui sera Exécutez chaque minute et en fonction du dernier temps d'activité d'un utilisateur mettra à jour le champ de colonne. Une autre manière sans le travail cron est, la prochaine fois qu'un utilisateur tente de vous connecter, vous vérifiez si la session n'est pas définie et qu'il est défini dans la base de données. Après l'authentification, mettez-la en conséquence.



4
votes

En raison de la nature de la bande, Vous ne pouvez pas savoir quand un utilisateur se déconnecte, y attache le câble ou ferme son ordinateur sans vous dire poliment.

Vous pouvez avoir un script (AJAX) Vérifiez toutes les minutes des X pour voir si le navigateur répond toujours et, sinon, basculer hors ligne - mais cela consomme des ressources supplémentaires. Voici comment par exemple un oeuvre d'IRCD: ils vous ping, vous êtes de retour. Si vous ne reculez pas, vous avez du temps et vous êtes déconnecté du serveur.

http est apatride, il n'y a pas d'autre solution intégrée. Peut-être que HTML5 et des sockets, mais ce serait le même principe que tout simplement Ajax.


3 commentaires

Alors maintenant, il n'y a rien que je ne peux pas faire. Je peux juste m'asseoir là-bas et regarder mes utilisateurs se fâcher :) C'est mauvais. Comment puis-je mettre en œuvre cela avec Ajax? Cette méthode n'est pas toujours en fonction de l'interaction de l'utilisateur avec le site. N'est-ce pas ce côté javascript de codage? Si donc l'utilisateur doit accéder à mon site pour faire une interaction avec Ajax :)


Vous implémentez la «dernière fois que vous avez vu moins de x minutes. Ça marche. Maintenant, pour augmenter la fiabilité de la fonctionnalité, diminuer x et forcer les utilisateurs à interagir chaque X / 2- (1 ms), en utilisant par exemple Ajax.


La réponse marquée comme correcte offre une solution pratique contraire à votre déclaration



1
votes

Vous pouvez exécuter une fonction sur chaque demande de page qui met à jour une ligne de votre base de données avec l'ID de votre utilisateur et un horodatage calculé pour l'avenir (par exemple, Time () + (60 * 5); Code> - cinq minutes). Ensuite, chaque fois que l'utilisateur tente de vérifier si le premier utilisateur est en ligne, vous pouvez le vérifier contre la base de données à l'aide d'une vérification «PULSE»:

$time = time();
$query = mysql_query("SELECT user_id, timestamp FROM online_users WHERE user_id = '$user_id' AND timestamp > '$time'");


0 commentaires

1
votes

solution farfached.

Utilisez un serveur nœud.js avec socket.io. Demandez au client de vous connecter au serveur via le côté de la clientèle. Le serveur est responsable de l'émission d'événements aux clients et d'attendre une réponse. Lors de la déconnexion ou de la réponse tardive, marquez l'utilisateur hors ligne.

Cela fonctionnera et fonctionnera probablement même sur les déconnectes de câble / la fermeture du navigateur, mais cela vaut-il la peine d'effort?


0 commentaires

0
votes

J'utiliserais une combinaison de sessions chronométrées qui n'ont pas eu d'activité récente et d'expirer de vieilles sessions lorsqu'une tentative de connexion réussie est faite.

Comme Konerak mentionné HTTP est apatride et il y a Aucun mode de racontation intégré si quelqu'un a quitté votre site . Vous pouvez le comprendre avec une sorte de technique de vote basée sur JavaScript, mais cela causerait beaucoup de frais généraux qui ne sont tout simplement pas nécessaires dans la plupart des situations.

à la place, vous devriez garder une trace de la dernière fois qu'il y avait une activité d'un utilisateur et stocker cette fois dans votre base de données ou mieux encore quelque chose comme memcache . Si un temps d'activité Dernier temps d'utilisateur est plus long qu'un délai d'expiration que vous décidez de supposer qu'ils ne sont plus sur le site.

La deuxième partie serait au lieu de nier une connexion lorsque quelqu'un essaie de se connecter après avoir quitté le site sans se déconnecter, laissez-les connecter et invalider toutes les vieilles sessions associées à leur compte. < / p>


0 commentaires

0
votes

Attendez l'homme, je pense avoir la bonne réponse parce que je faisais face au même problème! Essayez d'utiliser l'événement de la souris [Cliquez sur Movememouse ..] Mais avec un retard pour ne pas créer un crash dans le navigateur, vous utiliserez SintinTerval sur une XX SEC ou minutes après avoir enregistré la réponse de l'événement à votre DB dans la colonne Activités, mais Avec UNIX TIME Afin de la différencier ultérieurement à la fois. Son utile vraiment, je l'ai utilisé pour enregistrer l'acitulation de membres pour savoir ce qu'ils font vraiment en temps réel et obtiennent également les utilisateurs en ligne / hors ligne. Voici les fonctions JS usagées:

var body = document.getElementById('body');
var url = './member-activity.php?loggedUser=<?=$memb_id?>&curl=<?=($_SERVER['QUERY_STRING'])?>';
if(document.addEventListener) {
  document.addEventListener("click", _EventLogging, false);
    document.addEventListener("mousemove", _EventLogging, false);
}else{
  document.attachEvent("onclick", _EventLogging);
}
function _EventLogging(){
//call it after a delay of 
setTimeout(AjaxUrl(url), 2000); //delay of 2 sec after every move of cursor
}
//AjaxUrl is a js function that calls a php file to perform the activity logging via AJAX
</script>
<div id="id"></div>


0 commentaires

0
votes

Eh bien la vraie réponse à votre question "Comment puis-je mettre à jour la table sans interaction utilisateur?"

est le planificateur d'événement MySQL, vous planifiez un événement (requête) à exécuter à chaque fois que vous souhaitez même si l'utilisateur est hors ligne, lisez-le ici ( http://dev.mysql.com/doc/refman/5.1/fr/events-overview.html )


0 commentaires

3
votes
CREATE TABLE `user_online` (
`session` char(100) NOT NULL default '',
`time` int(11) NOT NULL default '0'
) TYPE=MyISAM;

<?php

session_start();
$session=session_id();
$time=time();
$time_check=$time-600; //SET TIME 10 Minute

$host="localhost"; // Host name
$username=""; // Mysql username
$password=""; // Mysql password
$db_name="test"; // Database name
$tbl_name="user_online"; // Table name

// Connect to server and select databse
mysql_connect("$host", "$username", "$password")or die("cannot connect to server");
mysql_select_db("$db_name")or die("cannot select DB");

$sql="SELECT * FROM $tbl_name WHERE session='$session'";
$result=mysql_query($sql);

$count=mysql_num_rows($result);

if($count=="0"){

$sql1="INSERT INTO $tbl_name(session, time)VALUES('$session', '$time')";
$result1=mysql_query($sql1);
}

else {
"$sql2=UPDATE $tbl_name SET time='$time' WHERE session = '$session'";
$result2=mysql_query($sql2);
}

$sql3="SELECT * FROM $tbl_name";
$result3=mysql_query($sql3);

$count_user_online=mysql_num_rows($result3);

echo "User online : $count_user_online ";

// if over 10 minute, delete session
$sql4="DELETE FROM $tbl_name WHERE time<$time_check";
$result4=mysql_query($sql4);

// Open multiple browser page for result


// Close connection

mysql_close();
?>

0 commentaires

1
votes

Vous pouvez utiliser cette méthode 1. Vérifiez l'état de l'utilisateur Si c'est une dernière activité de chèque en ligne Si c'est plus de 10 min, Statut sur Offline S'il est inférieur à 10 minutes montrant que l'utilisateur en ligne Si c'est hors ligne, montrez l'utilisateur hors ligne

  1. Lorsque l'utilisateur utilise ce site à jour la dernière activité dans chaque "x" min avec AJAX
  2. Lorsque l'utilisateur clique sur le statut de déconnexion de la connexion à la ligne hors ligne. Cela pourrait être votre structure de base de données.

     Entrez la description de l'image ici


0 commentaires

0
votes

Vous pouvez y parvenir en enregistrant la dernière activité de l'utilisateur (sur chaque page Charger, Actualiser, Action One Effectue) dans la base de données, puis vérifiez session.gc_maxlifetime (en secondes) et calculez si l'utilisateur la session a expiré ou non, en utilisant la dernière activité de l'utilisateur.


0 commentaires

0
votes

En réalité, le seul moyen précis de le faire consiste à utiliser Websocket , il communiquera avec l'utilisateur avec une communication en temps réel, essayez Ratchet .


0 commentaires