Creo que no lo has entendido. Vamos plantear un sistema con pseudocódigo.
Planteamiento de la tabla:
user_id | name | password | online | last_active.
user y password guardarian lo que tu imaginas que guardan. online puede guardar un estado forzado de 0 o 1 según el usuario. last_active guardaría un timestamp de la ultima acción que ha realizado el usuario.
Ejemplo
1 | drvy | abcd123456abcd | 1 | 1571126689
Soy drvy, con id 1, tengo un hash muy raro, estoy conectado y mi última acción fue a las 10/15/2019 @ 8:04am (UTC).
Bien, ahora, cada vez que navegue a una página, o haga una acción cualquiera mientras este identificado como drvy, vas a actualizar el campo last_active por el timestamp actual.
Primer user case:- Inicio sesión ->el sistema guarda timestamp y pone la columna "online" en 1.
--- Navegó a mi perfil -> el sistema guarda timestamp
------ Me cambio el correo -> el sistema guarda timestamp
--- Voy a la portada -> el sistema guarda timestamp
- Cierro la sesión -> el sistema guarda timestamp y pone la columna "online" en 0.
Segundo user case:- Inicio sesión -> el sistema guarda timestamp y pone la columna "online" en 1.
--- Navegó a mi perfil -> el sistema guarda timestamp
------ Me cambio el correo -> el sistema guarda timestamp
--- Voy a la portada -> el sistema guarda timestamp
- Cierro la pestaña sin cerrar sesión.
Ahora, la función para comprobar si el usuario esta online:
bool isOnline (int user_id) {
int grace_period
= (time() - 1200); char query = 'SELECT user_id FROM users WHERE user_id = ' . user_id . ' AND (online = 1 AND last_active > ' . grace_period . ')';
return (make_query(query) > 0 ? true : false);
}
Que hacemos. Establecemos un periodo de gracia de 20 minutos (1200 segundos que se restan al tiempo actual). Hacemos una query que dice: Dame todos los usuarios cuyo id es user_id y que: están marcados como que estan online y su ultima acción fue dentro del periodo de gracia y si la query retorna algún usuario (más de 0) es que el user_id está online. Así, si un usuario se sale sin cerrar la sesión, solo se le verá como online durante 20 minutos más o si sale de manera adecuada se le mostrará como offline de inmediato.
En el primer user case, desde que inicia sesión hasta que la cierra se le verá online e inmediatamente después se le verá como offline. En el segundo user case, se le verá online desde que inicia sesión hasta pasados 20 minutos de el cerrar la pestaña (y por lo tanto no realizar ninguna acción).
De hecho el sistema de este foro ni siquiera utiliza la columna online. Simplemente se basa en la cuando fue la última acción de usuario para considerarlo en linea o no.
Saludos