Básicamente, estas cosas funcionan de la siguiente manera.
Cada vez que el usuario realiza acciones (actualización de chat, mensaje enviado, página visitada, etc.), un token asociado al usuario (token que se guarda en su servidor, DB, por ejemplo) se actualiza con la hora actual.
| User ID | Last action |
-------------------------------------
| 14 (mark) | 2012-02-09-10:34:53 |
| 56 (phil) | 2012-02-09-09:12:34 |
| 9 (john) | 2012-02-09-10:33:11 |
Y luego decide que un usuario está en línea si su token no es demasiado antiguo (¿5/10 minutos?)
Puede mejorar este método si usa AJAX para enviar una solicitud periódica al servidor cada 1 minuto más o menos. Esta solicitud AJAX actualiza el valor del token. Entonces, de esta manera, también puede decir que el usuario está en línea si no hace nada más que mirar la página. Y cuando sale (cierra el navegador o la pestaña), la llamada periódica de AJAX deja de funcionar, por lo que después de 5/10 minutos el usuario se declara fuera de línea .
¡Buena suerte!