Il n’y a malheureusement pas de moyen de “surveiller” l’état d’une session PHP à ma connaissance, ni d’exécuter un code quand elle expire. Par contre, ce qu’il est possible de faire pour répondre au même problème, c’est de mettre à jour dans ta base de données une entrée last_activity
(peu importe le nom), de type DATETIME
(ou équivalent selon ton SGBD, enfin une date et heure quoi), et d’y mettre la date courante à chaque requête.
Pour connaître les gens connectés, il suffira de lister toutes les personnes dont le champ last_activity
contient une date assez récente (par exemple moins de vingt minutes — après, à toi de voir après quel délai d’inactivité tu considères que la personne est partie), par exemple avec une requête SQL de ce genre :
SELECT * FROM users WHERE last_activity > SUBTIME(NOW(), "00:20:00")
Si ton système s’exécute en temps réel sans jamais recharger la page (ce qui serait cohérent pour un système de chat), l’inconvénient de cette technique c’est que sans actualisation de la page, la date ne sera jamais mise à jour. Pour contrer ce problème, une solution courante c’est d’envoyer une requête AJAX régulièrement (par exemple, toutes les minutes) pour vérifier que l’utilisateur est toujours là. S’il ferme la page, les requêtes arrêteront d’être envoyées, et on saura qu’il est parti.
Avec un tel système, il est même possible d’être plus fin : quelques minutes après le dernier signe de vie, on peut déjà supposer l’utilisateur déconnecté, vu que sinon la date de dernière activité est mise à jour en permanence.
C’est la même idée (même si implémentée différemment et en français) que le lien de mon voisin du dessus .