2010-12-13 5 views
2

Je dispose d'un client de chat simple qui permet aux utilisateurs de se connecter avec un nom d'utilisateur et stocke les messages qu'ils écrivent dans une base de données SQL. Toutes les 3 secondes, la base de données imprime simplement toutes les lignes. Donc, c'est essentiellement un client de chat. Je voudrais garder une liste de qui est en ligne. Comment puis-je faire ceci? Comment puis-je sentir quand quelqu'un a fermé le navigateur?Comment savoir quand l'utilisateur ferme le navigateur? Application de chat

En ce moment, je tire le nom d'utilisateur comme

$name = $_COOKIE["name"]; 

et si cette valeur est vide, je sais qu'ils sont partis. Mais une fois qu'ils sont partis, il est trop tard pour savoir quel était leur nom d'utilisateur, donc je ne peux pas savoir exactement qui est parti.

Des idées? Je suis assez nouveau pour php, javascript et html, donc gardez cela à l'esprit :)

+0

@ ehmad1 façon de collaborer l'homme! pouces vers le haut! – Mike

Répondre

1

mettre les utilisateurs en ligne dans une table qui aura un champ nommé comme la mise à jour « lastSeen » ce champ toutes les quelques secondes avec appel ajax ..

appel ajax être faites someting comme ceci:

window.setInterval(function() { 
    $.ajax({  
     url: _URL_ENGINE + "/updateLastSeen/?userid=" + userID, 
     success: function(data) { 

     } 
    }); 
}, 2000); // 2000 means 2 seconds 

maintenant pour interroger la liste des joueurs en ligne u peut les interroger comme

select * from players WHERE lastSeen > DATE_SUB(NOW(), interval 40 SECOND) 

this helps

0

Utilisez l'événement onbeforeunload.

+0

heres un exemple http://www.4guysfromrolla.com/demos/OnBeforeUnloadDemo1.htm – basarat

+4

ce n'est pas une méthode fiable, si votre envoi d'une demande AJAX quand ils le quittent pourrait ne pas traiter à temps – fire

3

En supposant que vous utilisiez AJAX pour extraire les messages de discussion toutes les X secondes, mettez à jour votre table d'utilisateurs à ce moment avec l'horodatage actuel pour cet utilisateur. Ensuite, toute personne ayant un horodatage dit plus de 10 secondes, vous saurez qu'elle a quitté la page.

+0

jusqu'à voter! J'ai aussi ajouté un échantillon de code – ehmad11

5

Il est difficile d'envoyer une dernière requête au serveur lorsque quelqu'un ferme la fenêtre, car les navigateurs n'attendent généralement pas que l'exécution JS se termine lorsque l'utilisateur veut fermer la fenêtre (comme dans le cas onbeforeunload). Chaque fois que je suis confronté à une situation comme celle-ci, j'ai tendance à utiliser onbeforeunload pour envoyer une requête finale (qui arrive rapidement et se termine généralement avant la fermeture de la fenêtre du navigateur), mais aussi implémenter une fonction de temporisation. La fonction de délai d'attente fonctionnerait comme suit:

Chaque fois que l'utilisateur envoie quelque chose au serveur, le serveur le reconnaît comme «toujours là». En même temps, le client règle une minuterie de, disons, 45 secondes. Si l'utilisateur ne tape rien pendant 45 secondes, le client envoie un signal "toujours actif" pour rester connecté. Maintenant, le serveur doit exécuter une routine removeInactive() toutes les 60 secondes (permettre une marge de connexion lente de 15 secondes, d'où les 45/60 secondes) qui supprime tous les utilisateurs qui n'ont pas envoyé un signal "encore en vie" dans le dernier 60 secondes.

Ce système a bien fonctionné pour moi jusqu'à maintenant, vous pouvez l'essayer par vous-même.

Questions connexes