2009-08-03 4 views
1

Actuellement, dans mon script PHP, après la connexion d'un utilisateur, j'ai stocké session_login = 1. Mais j'ai un problème. J'ai l'habitude d'utiliser Firefox, multi-onglet (je crois que la plupart des gens et tous les navigateurs web d'aujourd'hui ont une fonction multi-onglet). J'ai fermé l'onglet qui a la session, mais je n'ai pas fermé le navigateur. Après quelques heures, je reviens sur la même page qui nécessite que je me connecte, mais ce n'est pas le cas. Il ne nécessite pas de me connecter à nouveau (je pense que c'est appelé "Session"). Est-il possible de se déconnecter de l'utilisateur s'il ferme l'onglet au lieu de fermer le navigateur?Comment se déconnecter d'un utilisateur en PHP?

J'ai actuellement une solution, le temps d'inactivité. Mais, j'ai des connaissances très limitées en date/heure chose en PHP, donc ce serait la dernière option. Je voulais savoir, y a-t-il autre chose que je puisse faire, en plus d'utiliser le time-inactif?

+0

Lorsque vous utilisez la réponse d'Amber, vous serez connecté lorsque vous avez * pas d'activité * pendant une heure. L'onglet peut être * toujours ouvert * dans le navigateur, mais ne rien faire vous déconnectera automatiquement * sans aucune invite *. Imaginez une situation: vous avez un formulaire ouvert sur la page pendant une heure, et après avoir soumis les données, vous trouvez que vous êtes déjà déconnecté. Ou après avoir pris une pause-café, vous appuyez sur un lien et vous êtes expulsé. Je pense que ce sera un problème d'utilisabilité – Dan

+0

S'il vous plaît tester votre projet une fois de plus pour voir si j'ai raison ou non – Dan

+0

Peut-être que vous pourriez voir le même problème d'utilisation lorsque vous utilisez PHPMyAdmin lorsque vous êtes déconnecté de façon inattendue – Dan

Répondre

2

PHP a un moyen facile de définir la durée d'une session durera avant son expiration:

session_set_cookie_params(3600); // make it expire after 1 hour 

Il suffit de le passer le nombre de secondes pendant la session précédente (dans l'exemple, 1 heure = 60 minutes = 3600 secondes).

http://us2.php.net/manual/en/function.session-set-cookie-params.php

+0

Cette méthode fonctionne pour le projet en cours (résoudre mon problème temporaire). Mais le prochain projet, je pourrais avoir besoin d'utiliser la réponse de Richy C, parce que l'utilisateur peut rester sur mon site pendant plus de 1 heure. Difficile de choisir la meilleure réponse. Eh bien, je vais choisir la meilleure réponse basée sur le "voté" – bbtang

+0

Votre méthode va déconnecter l'utilisateur s'il n'y avait pas d'activité pendant une heure (même avec l'onglet ouvert).Mais la question déconnectait l'utilisateur quand il ferme un onglet. PS – Dan

+0

IMO, seules les requêtes AJAX répétant toutes les N minutes peuvent résoudre la tâche – Dan

2

Un cookie de session est seulement effacé du navigateur lorsque la session du navigateur est fermé (à savoir lorsque le navigateur est fermé): d'où le nom. Si vous souhaitez que la session soit effacée peu après la fermeture de l'onglet, vous pouvez définir une durée d'expiration très courte sur le cookie (environ 5 minutes) et la stocker dans la base de données. Ayez ensuite une fonction javascript sur la page web appelant un fichier de votre serveur toutes les minutes: ce fichier "rafraîchit" alors l'entrée cookie/base de données pour les cinq prochaines minutes. Si elles quittent alors votre site pendant plus de cinq minutes, la session est invalidée.

Vous pouvez également ajouter une fonction Javascript « onunload » qui détecte s'ils ont fermé la page Web ou allé à une autre page: vous pouvez ajouter un crochet sur ce paramètre pour appeler une fonction « destroycookie » - cependant, vous aurez à vérifiez qu'ils ne sont pas simplement allés à une autre page sur votre site et n'ont pas réellement deux pages de votre site ouvertes dans deux onglets.

+0

Cela semble cool. Mais malheureusement, je ne connais pas JavaScript. – bbtang

+0

Oh ya, btw, vous avez mentionné que "appelant un fichier de votre serveur chaque minute", si j'ai 1000 utilisateurs ou plus en même temps connecté, c'est à chaque minute mon serveur a besoin de répondre à ces utilisateurs 1000 ++, am J'ai raison? Cela ralentira-t-il les performances de mon serveur? Y a-t-il un meilleur moyen? – bbtang

+0

Une combinaison de http://www.quirksmode.org/js/xmlhttp.html et setInterval (sendRequest ('refresh.php'), 60000); pour récupérer le "refresh.php" chaque minute (6000 millisecondes) devrait faire le travail. –

0

Je crois que l'option que vous recherchez est le paramètre pour l'expiration du cookie de session. Je ne me souviens pas de la commande PHP pour cela, mais vous devriez pouvoir mettre le cookie à expiration quand la fenêtre se ferme.

Voici la documentation de la session de PHP: http://us2.php.net/manual/en/book.session.php

+0

Merci pour le lien, je vais certainement y jeter un coup d'oeil – bbtang

0

Peut-être que vous pouvez utiliser session_write_close()?

+0

Je suis totalement désemparé à propos de session_write_close(). Je suis un nouveau codeur php. Je vais vérifier celui-ci. Merci – bbtang

0

Il y a un commentaire sur la documentation PHP pour la fonction session_destroy qui pourrait vous être utile: http://us2.php.net/manual/en/function.session-destroy.php#71889

+0

J'utilise normalement la session_destroy uniquement sur la page de déconnexion. Euh, eh bien, laissez-moi réfléchir, je crois que cela pourrait être utile d'une certaine manière et pourrait probablement résolu mon problème. Focus, focus, focus .. penser, penser, penser .... – bbtang

Questions connexes