Je construis un site Web communautaire. Les utilisateurs se connecteront et se déconnecteront comme habituellement. p>
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? P>
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. p>
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. P>
13 Réponses :
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 Cependant, la vraie question est la suivante: ça vaut la peine? Je n'ai pas encore vu aucun système d'authentification similaire. P>
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 code> au lieu de /foo.php code>. De cette manière, vous pouvez placer le code pour mettre à jour l'activité de l'utilisateur uniquement dans le fichier index.php code> et non dans le fichier foo.php code>.
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 B> 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
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. P>
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;
}
?>
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.
En raison de la nature de la bande, 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. P>
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. P>
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
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'");
solution farfached. p>
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. p>
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? P>
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. P>
Comme Konerak mentionné HTTP est apatride et il y a Aucun mode de racontation intégré si quelqu'un a quitté votre site fort>. 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. P>
à 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 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,
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>
Eh bien la vraie réponse à votre question "Comment puis-je mettre à jour la table sans interaction utilisateur?" P>
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 ) p>
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();
?>
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 P>
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 strong> (en secondes) et calculez si l'utilisateur la session a expiré ou non, en utilisant la dernière activité de l'utilisateur. P>
En réalité, le seul moyen précis de le faire consiste à utiliser Websocket fort>, il communiquera avec l'utilisateur avec une communication en temps réel, essayez