Mediante ajax haz que el usuario realice peticiones constantemente (cada 10/30/60 segundos), en el momento en el que en un periodo del tiempo, fijado anteriormente, no se reciba ninguna petición significará que el usuario se habrá desconectado (cerrado el navegador, apagado el ordenador, sin conexión a internet, etc, etc).
Esta es la respuesta más acertada creo yo, pero tengo una duda. Como compruebas que no has recibido ninguna petición? Quiero decir yo entro en la página y se registra mi sesión y ahora me voy, por lo tanto, qué proceso es el que analizaría cada 20 o 30 segundos si sigo o no online? si ya no estoy ejecutando ninguna página? No sé si me explico, si alguien me entiende que por favor conteste, sino diganmelo y me explico un poco mejor xD
Imaginen que encerramos una mariposa en una caja transparente, cerrada al vacio, la tapamos con una manta y la dejamos ahí durante 1 día...
¿Cuando sabremos si la mariposa sigue viva? Cuando destapemos la manta.
Ahora la mariposa es el usuario, que siga viva significa que sigue conectado, la caja es la página Web y la acción de quitar la manta es cuando nosotros visitamos la página Web administrativa para saber quien sigue conectado.
La página Web que visita el usuario es simple; cada vez que el usuario haga una petición cada X segundos se actualizará en la base de datos la fecha y hora exacta (timestamp) en la que realizó la petición. A este valor lo llamaremos Y.
Ahora nosotros visitamos la página Web administrativa (destapamos la manta) y hacemos la siguiente consulta para saber aquellos usuarios que no se encuentran conectados:
timestamp - valor Y del usuario > X
Si la diferencia entre la fecha actual y la fecha del usuario es mayor que X deducimos que el usuario no se encuentra activo, ya que cada X segundos el usuario tubo que actualizar el valor de Y, y si no lo hizo fue por que se desconectó...
¿Por qué os he metido el cuento de la mariposa? Porque en este caso, hasta que nosotros no visitamos la página Web administrativa no somos conscientes de la realidad, al igual que hasta que no destapamos la manta no sabemos si la mariposa sigue viva...
Existe otro método... que seria como quitarle la manta a la caja o quitársela en periodos de Z segundos y observarla continuamente. Para ello habría que ejecutar una aplicación en el servidor para que esté alerta todo el tiempo en busca de usuarios desconectados, en base a la consulta de arriba.
Y he ahí la cuestión, ¿queremos ser nosotros quien avisa o queremos que nos avisen?