elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web (Moderador: #!drvy)
| | |-+  [Pregunta]: Usuario conectado (Señal verde) Un poco de logica...
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Pregunta]: Usuario conectado (Señal verde) Un poco de logica...  (Leído 3,434 veces)
Leguim


Desconectado Desconectado

Mensajes: 720



Ver Perfil
[Pregunta]: Usuario conectado (Señal verde) Un poco de logica...
« en: 10 Octubre 2019, 02:11 am »

Buenas noches,
Quería hacer un sistema (ya conocido) donde se muestre con x icono o estado a un usuario que está conectado (sesión iniciada)

Yo haría así: crear un campo en la tabla usuarios que se llame campo de (tipo tyni int) de manera que solo guarde 0 y 1... el 0 desconectado y 1 conectado... cuando inicie sesión el usuario su campo conectado será = 1 y cuando cierre sesión (logout) será = 0

Me parece que esta logica se queda corta... que opinan???


En línea

#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.855



Ver Perfil WWW
Re: [Pregunta]: Usuario conectado (Señal verde) Un poco de logica...
« Respuesta #1 en: 10 Octubre 2019, 04:09 am »

Generalmente se suele usar un sistema de acción directa (el usuario se puede conectar o desconectar manualmente) + un timeout desde su última acción. Imaginate que un usuario se conecta pero nunca se "desconecta".. ese caso se resuelve mediante un sistema que guarda un timestamp (por ejemplo) de su última acción y si digamos han pasado más de 15 minutos desde entonces, se le marca como desconectado.

Lo puedes ver en este mismo foro abajo del todo donde pone "Usuarios en linea".

Saludos


En línea

Leguim


Desconectado Desconectado

Mensajes: 720



Ver Perfil
Re: [Pregunta]: Usuario conectado (Señal verde) Un poco de logica...
« Respuesta #2 en: 10 Octubre 2019, 04:42 am »

Hola!

Imagino que para esto deba de usar ajax para el timeout y luego ejecutar codigo php donde cierro la sesion y lo marco como desconectado, aunque imaginate que la persona no cierra su sesión y solamente cierra la pestaña de google dicha sesión queda abierta pero el navegador o el cliente ya fue cerrado... entonces como ejecutaria esto?
En línea

#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.855



Ver Perfil WWW
Re: [Pregunta]: Usuario conectado (Señal verde) Un poco de logica...
« Respuesta #3 en: 15 Octubre 2019, 10:28 am »

Creo que no lo has entendido. Vamos plantear un sistema con pseudocódigo.

Planteamiento de la tabla:

Código:
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
Código:
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:

Código
  1. bool isOnline (int user_id) {
  2.    int grace_period = (time() - 1200);
  3.    char query = 'SELECT user_id FROM users WHERE user_id = ' . user_id . ' AND (online = 1 AND last_active > ' . grace_period . ')';
  4.    return (make_query(query) > 0 ? true : false);
  5. }

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
« Última modificación: 15 Octubre 2019, 10:30 am por #!drvy » En línea

Leguim


Desconectado Desconectado

Mensajes: 720



Ver Perfil
Re: [Pregunta]: Usuario conectado (Señal verde) Un poco de logica...
« Respuesta #4 en: 16 Octubre 2019, 22:56 pm »

Woao, nada que ver lo que pensaba de como hacerlo... Está muy buena tu idea!
aunque todavía tengo una pregunta (algo tonta) pero ¿Donde podría ejecutar la función de php is_online(id_user); ?

Gracias!!!
En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.606


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: [Pregunta]: Usuario conectado (Señal verde) Un poco de logica...
« Respuesta #5 en: 17 Octubre 2019, 01:26 am »

Puedes utilizar websocket sin la necesidad de utilizar bases de datos, asi puedes saber cuando un usuario está en línea o no, enganchas cada item de usuario a un id de evento distinto y lanzas una conexión de un solo websocket y ya.

Saludos.
En línea

Leguim


Desconectado Desconectado

Mensajes: 720



Ver Perfil
Re: [Pregunta]: Usuario conectado (Señal verde) Un poco de logica...
« Respuesta #6 en: 17 Octubre 2019, 15:35 pm »

WHK: realmente estuve pensando en usar sockets en mi aplicación web pero no solamente me parece algo difícil (pero difícil en serio, a cada rato trato de entenderlo mirando vídeos o buscando información, pero no lo entiendo), que necesitas abrir una consola, que después no entiendo como puedo ejecutar los sockets ya cuando la aplicación esté en producción... si usar sockets de alguna manera tiene vulnerabilidades y hay que parchearlas, (no estoy seguro de esta ultima)

!#drvy: ¿Donde podría ejecutar la función de php is_online(id_user); ?  :silbar:
« Última modificación: 17 Octubre 2019, 15:40 pm por MiguelCanellas » En línea

Leguim


Desconectado Desconectado

Mensajes: 720



Ver Perfil
Re: [Pregunta]: Usuario conectado (Señal verde) Un poco de logica...
« Respuesta #7 en: 23 Octubre 2019, 01:31 am »

Estaba pensando poner la función "Is_Online" es decir, que se ejecute cada 10 minutos pero de una forma más global, es decir:

Código
  1. function Is_Online($id_user)
  2. {
  3.     [Edita en la base de datos donde la id de usuario sea igual a id_user y conectado = 1 y el tiempo de gracia excedió]
  4. }
  5.  
  6. // y cambiar por
  7. function Is_Online()
  8. {
  9.       [Editar en la base de datos todos los usuarios donde conectado = 1 y el tiempo de gracia se excedió]
  10. }
  11.  

Pero no se como puedo hacer que cada 10m o 1m se pueda ejecutar esta consulta y si es recomendable.

Hacer algo como "LongPolling" pero nose por donde empezar, si me pudieran decir si esto es recomendable se los agradezco mucho.
« Última modificación: 23 Octubre 2019, 01:35 am por MiguelCanellas » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Logica buena pero... al simularlo se vuelve un poco loco!!
Electrónica
...DaNiEl... 4 4,260 Último mensaje 7 Agosto 2009, 03:33 am
por h0oke
¿Como mantengo un Usuario Conectado?
Desarrollo Web
PedroX15 3 3,531 Último mensaje 12 Octubre 2011, 20:34 pm
por SoloNuevas
Conectado con buena señal sin poder navegar. alfa awus036h « 1 2 »
Hacking Wireless
Schaiden 13 11,128 Último mensaje 17 Septiembre 2015, 23:20 pm
por Sh4k4
Ip skype usuario no conectado
Dudas Generales
litosnano 1 2,889 Último mensaje 21 Junio 2016, 20:24 pm
por [Arg] $triker;
[Pregunta]: Lógica de un buscador de marketplace/ecommerce
Desarrollo Web
Leguim 0 1,751 Último mensaje 28 Diciembre 2022, 14:22 pm
por Leguim
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines