Foros del Web » Programando para Internet » PHP »

Gestionar el estado de los usuarios

Estas en el tema de Gestionar el estado de los usuarios en el foro de PHP en Foros del Web. Os explico en resumen el problema, a ver si a alguien se le ocurre cómo podría hacerse esto: Imaginemos una web que simula un juego ...
  #1 (permalink)  
Antiguo 14/12/2012, 03:26
 
Fecha de Ingreso: abril-2012
Mensajes: 63
Antigüedad: 12 años, 6 meses
Puntos: 2
Gestionar el estado de los usuarios

Os explico en resumen el problema, a ver si a alguien se le ocurre cómo podría hacerse esto:

Imaginemos una web que simula un juego de mesa para varios jugadores. El juego no tiene principio ni final, meramente quien quiere participar en el se loguea y luego le da a un botón tipo "unirse al juego". La aplicación necesita saber cuántos usuarios están jugando, por un tema de turnos, así que se me ocurrió (genial que es uno ) colocar un botón "abandonar el juego".

Lo que pasa que muchos usuarios abandonan la web sin darle al botón de abandonar el juego, y en consecuencia en la base de datos me aparecen conectados muchos más usuarios de los que realmente lo están.

Y ahí viene la pregunta obvia: ¿Se os ocurre alguna forma de que cuando un usuario abandone la web se le cambie el estado a desconectado, o que se compruebe de alguna manera si el usuario está on cada cierto tiempo vía setinterval? La verdad es que no se me ocurre nada.

Gracias anticipadas.
  #2 (permalink)  
Antiguo 14/12/2012, 03:42
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 7 meses
Puntos: 406
Respuesta: Gestionar el estado de los usuarios

Primero deberías explicar como funciona tu juego, si es necesario estar presente en la página todo el tiempo, si se requiere una acción constante, o por el contrario, el jugador puede abandonar la página esperando a que otro jugador haga un movimiento/acción, en todo caso, si son la primera opción (que se requiere estar presente en la página en todo momento y es necesario una acción constante) puedes calcular el tiempo que ah tomado desde la ultima acción el jugador, así cada vez que un jugador envie una acción checas el tiempo de todos los jugadores en la partida, si este tiempo es mayor a X segundos/minutos lo podrías considerar que abandono el juego, pero ojo, todo depende como funcione tu juego, sin mas es muy difícil poder ayudarte...
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #3 (permalink)  
Antiguo 14/12/2012, 03:50
 
Fecha de Ingreso: abril-2012
Mensajes: 63
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Gestionar el estado de los usuarios

Gracias por responder.
El problema es que estoy en el caso dos. Es el típico juego de estrategia donde puedes estar un tiempo sin intervenir (por ejemplo si no eres atacado puedes meramente no hacer nada durante horas). Claro, al ser así las cosas la única manera que tengo de saber quién está y quien no sería o chequear si están en la web o a través de variables de sesión (aunque supongo que si el usuario no está no se puede saber si esas variables existen).
No sé, estoy hecho un lío.
  #4 (permalink)  
Antiguo 14/12/2012, 03:59
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 7 meses
Puntos: 406
Respuesta: Gestionar el estado de los usuarios

Es un caso mas problematico, no se si aparte de esperar un ataque el usuario tenga otras tareas mas que hacer (si existen recursos recolectarlos, si existe construcciones checar su estado, construcción de unidades, etc), en todo caso podrías implementar lo mismo, también debes indicar si tienes algún sistema de notificaciones (por ejemplo si es atacado avisarle vía email), si es así, podrías tomar el tiempo en que enviaste la ultima notificación y ver cuanto tiempo ah tardado de volver al juego, si pasa X horas/dias directamente indicar que el usuario POSIBLEMENTE abandono la partida, aparte, no indicas cuantos jugadores puede tener cada partida, si son pocos puedes checar cada que un jugador hace algún movimiento dentro de la partida checar el tiempo de inactividad de los otros jugadores y de hay clasificarlos, aun así no puedes descartar a todos, posiblemente un jugador puede que saliera de viaje, que no tenga internet accesible, etc...
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #5 (permalink)  
Antiguo 14/12/2012, 04:58
 
Fecha de Ingreso: abril-2012
Mensajes: 63
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Gestionar el estado de los usuarios

Es que el propio sistema del juego -no te voy a aburrir con los detalles, que bastante paciencia tienes ya ayudándome- hace que puedas intervenir activamente o poco menos que como un observador, y entonces desconectar a nadie meramente porque en media hora no hace nada tampoco sería la solución. Yo estaba intentando pensar en alguna función que se repitiera cada cierto tiempo y que chequeara si un usuario está en la web (una consulta a la url, o algo así), pero claro, me temo que si ese usuario no está en la web no podré acceder a los datos de su barra de navegación, no sé si estoy en lo cierto.
  #6 (permalink)  
Antiguo 14/12/2012, 05:03
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Gestionar el estado de los usuarios

Entiendo que básicamente quieres comprobar que el navegador sigue abierto, interactue o no.

En ese caso yo tendría una función en Ajax que notifique cada 'x' minutos al servidor que el usuario está online.
__________________
Aviso: No se resuelven dudas por MP!
  #7 (permalink)  
Antiguo 14/12/2012, 05:05
 
Fecha de Ingreso: abril-2012
Mensajes: 63
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Gestionar el estado de los usuarios

Eso sería justo lo que me iría genial. A riesgo de abusar, ¿cómo se podría implementar a grandes rasgos esa función?
  #8 (permalink)  
Antiguo 14/12/2012, 05:12
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Gestionar el estado de los usuarios

Cita:
Iniciado por roncco Ver Mensaje
Eso sería justo lo que me iría genial. A riesgo de abusar, ¿cómo se podría implementar a grandes rasgos esa función?
Simplementa hacer una llamada recursiva con prototype o a mano (con un timer) que haga una peticion del tipo:

callback.php?usuario=123

donde "123" sea el identificador del usuario, su nick o lo que sea. Para implementar un callback o una llamada recursiva con javascript en el navegador hay muchos tutoriales,formas y librerias.

Este es un ejemplo:

http://www.tutorialspoint.com/protot...x_tutorial.htm

Piensa que tu solo has de hacer la petición (request) al servidor, luego en el cliente no has de hacer nada porque tu trabajas con la sesión en la parte servidor del juego.
__________________
Aviso: No se resuelven dudas por MP!
  #9 (permalink)  
Antiguo 14/12/2012, 05:18
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 7 meses
Puntos: 406
Respuesta: Gestionar el estado de los usuarios

Personalmente no soy partidario de estar enviando cada X minutos una petición, y mas si la aplicación tiene potencial de tener muchos usuarios ya que podría llegar un momento en que se puede saturar y se pueda alentar, en fin, es una opinion, sigo pensando en que es mejor "analizar" la conducta del usuario, checar cada vez que el usuario haga una petición, ya sea para solo ver, o hacer algún cambio en el juego, y de hay ver cuanto tiempo pasa entre una acción y otra, así te puedes apoyar en los demás usuarios en la partida para calcular los tiempos, pero como siempre es una opinión y una opción mas
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #10 (permalink)  
Antiguo 14/12/2012, 05:21
 
Fecha de Ingreso: abril-2012
Mensajes: 63
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Gestionar el estado de los usuarios

Tú perdona, pero soy el típo más burro del universo y sólo te he entendido a medias.

Se trataría -creo entender- de llamar a una función php a través de un timer (no he usado nunca prototype, sino jquery) como setinterval. Esa función puede tener un parámetro que se correspondería con la id del usuario. Si la función no tiene éxito supongo que devolverá false y entonces puedo desconectar al usuario. No sé si esta es la teoría o estoy diciendo una colección enorme de sandeces.

Lo que no he entendido es qué consulta puede hacer la función para saber si un usuario con una id determinada está o no en la web. Tú perdona que sea tan corto, mi cerebro no da para más.

Gracias por la paciencia.
  #11 (permalink)  
Antiguo 14/12/2012, 05:23
 
Fecha de Ingreso: abril-2012
Mensajes: 63
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Gestionar el estado de los usuarios

Perdona, Nemutagk, se cruzaron los mensajes. Lo bueno de lo que propone Malenko es que con una comprobación que hiciera cada hora, para lo que lo necesito, ya me serviría, así que no colapsaría mucho el servidor.
  #12 (permalink)  
Antiguo 14/12/2012, 05:36
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 7 meses
Puntos: 406
Respuesta: Gestionar el estado de los usuarios

En todo caso sería casi lo mismo, solo que en vez de esperar una acción del usuario solo sería cuestión de esperar a que la función envie la petición, en fin, aun así tendrías que guardar la hora en que llego la ultima petición ya sea del usuario o de la función y de hay calcular cuanto tiempo tiene inactivo el usuario
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #13 (permalink)  
Antiguo 14/12/2012, 05:38
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Gestionar el estado de los usuarios

Cita:
Iniciado por Nemutagk Ver Mensaje
Personalmente no soy partidario de estar enviando cada X minutos una petición, y mas si la aplicación tiene potencial de tener muchos usuarios ya que podría llegar un momento en que se puede saturar y se pueda alentar, en fin, es una opinion, sigo pensando en que es mejor "analizar" la conducta del usuario, checar cada vez que el usuario haga una petición, ya sea para solo ver, o hacer algún cambio en el juego, y de hay ver cuanto tiempo pasa entre una acción y otra, así te puedes apoyar en los demás usuarios en la partida para calcular los tiempos, pero como siempre es una opinión y una opción mas
Lo de poner "x minutos" era porque si ponia segundos iba a parecer que era algo a consultar de forma continua. Obviamente el tiempo para hacer esta comprovación depende de la carga de usuarios que pueda tener su aplicación. Si realmente quiere saber los usuarios online, sin necesidad de desconectarlos, la única forma es realizando un "ping" cada cierto intervalo.


Cita:
Iniciado por roncco Ver Mensaje
Tú perdona, pero soy el típo más burro del universo y sólo te he entendido a medias.

Se trataría -creo entender- de llamar a una función php a través de un timer (no he usado nunca prototype, sino jquery) como setinterval. Esa función puede tener un parámetro que se correspondería con la id del usuario. Si la función no tiene éxito supongo que devolverá false y entonces puedo desconectar al usuario. No sé si esta es la teoría o estoy diciendo una colección enorme de sandeces.

Lo que no he entendido es qué consulta puede hacer la función para saber si un usuario con una id determinada está o no en la web. Tú perdona que sea tan corto, mi cerebro no da para más.

Gracias por la paciencia.
El funcionamiento lo has pillado perfectamente. JQuery te sirve porque tiene la misma funcionalidad. Ahora entrando a la pregunta, usaremos un ejemplo porque se entenderá más facil.

Tienes a un usuario online en la página. Tal y como entra (creo que el evento Load de jquery o similar) haces el callback/ping inicial al servidor. Tu en el servidor recibirás el ID del usuario y registras en una tabla: el ID, la hora del ping, la hora del proximo ping. La hora del proximo ping la puedes saber facil: hora del ping recibido + tiempo de intervalo entre pings (una hora por ejemplo). Pongamos que las columnas de la tabla se llaman: usuario, hora_inicio, hora_fin.

Ahora bien, quieres saber que usuarios estan ahora mismo en linea. Como lo harias? Te lo pongo en t-sql, quizas en mysql getdate tenga otro nombre:

Código PHP:
select usuario
from 
[tabla]
where hora_inicio<=getdate() and getadate()<=hora_fin 
__________________
Aviso: No se resuelven dudas por MP!
  #14 (permalink)  
Antiguo 14/12/2012, 05:41
 
Fecha de Ingreso: abril-2012
Mensajes: 63
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Gestionar el estado de los usuarios

Sí, lo que pasa es que como en el juego la falta de acciones no entraña que no se esté online, me interesaba lo que apuntaba Malenko de comprobar cada cierto tiempo si el usuario sigue en la web, más que si ha hecho o no alguna acción en un lapso de tiempo. Lo que no sé es cómo se puede comprobar si el navegador de fulanito está o no en una determinada url, que supongo que es a lo que Malenko se refería.
  #15 (permalink)  
Antiguo 14/12/2012, 05:43
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Gestionar el estado de los usuarios

Cita:
Iniciado por roncco Ver Mensaje
Sí, lo que pasa es que como en el juego la falta de acciones no entraña que no se esté online, me interesaba lo que apuntaba Malenko de comprobar cada cierto tiempo si el usuario sigue en la web, más que si ha hecho o no alguna acción en un lapso de tiempo. Lo que no sé es cómo se puede comprobar si el navegador de fulanito está o no en una determinada url, que supongo que es a lo que Malenko se refería.
Dale un vistazo a mi último comentario, creo que estabamos escribiendo todos a la vez
__________________
Aviso: No se resuelven dudas por MP!
  #16 (permalink)  
Antiguo 14/12/2012, 05:50
 
Fecha de Ingreso: abril-2012
Mensajes: 63
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Gestionar el estado de los usuarios

Gracias por responder con tanto detalle, Malenko. Estoy todavía tratando de procesar la información (tú perdona, pero estamos a distinto nivel y cosas que tú las debes tener por la mano como lo de hacer un ping a mí me suena a servocroata antiguo)
Deduzco que haciendo un ping (ya intentaré averguar cómo diantre se hace eso, que tampoco te quiero volver loco) consigo averiguar si hay alguna variación de actividad (o algo así) entre una llamada y otra, y si no ha habido variación, es que el usuario no está en la web. ¿es algo así?
  #17 (permalink)  
Antiguo 14/12/2012, 05:56
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 7 meses
Puntos: 406
Respuesta: Gestionar el estado de los usuarios

Te estas complicando, lo unico que necesitas hacer es enviar una petición Ajax cada X tiempo, al recibir la petición en el servidor debes tener como identificar al usuario (ya sea enviando el ID, con una cookie o sesiones), tomas la fecha/hora de la petición y la guardas en una celda/tabla en tu BD, después en algún lado verificas la ultima petición hecha del usuario (la fecha/hora) que guardaste en la petición Ajax, y ves cuanto tiempo tiene, si al comprobar el tiempo que ah pasado de la ultima actualización a la fecha/hora actual es mayor al tiempo especificado en la función que hace la petición Ajax quiere decir que el usuario a abandonado la página....
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #18 (permalink)  
Antiguo 14/12/2012, 06:01
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Gestionar el estado de los usuarios

Cita:
Iniciado por roncco Ver Mensaje
Deduzco que haciendo un ping (ya intentaré averguar cómo diantre se hace eso, que tampoco te quiero volver loco) consigo averiguar si hay alguna variación de actividad (o algo así) entre una llamada y otra, y si no ha habido variación, es que el usuario no está en la web. ¿es algo así?
Más o menos. Con el ping lo que haces es ver si el navegador está con tu página abierta. Si la cerrase no saltaría la función de jquery que hace la petición a tu página. Es esa la idea con la que te has de quedar. Tu imaginate que estás en una habitación y para saber si la habitación de al lado hay alguien, llegas a un acuerdo y quien la ocupe ha de gritar "estoy aqui" cada 10 segundos. Tu estarias sentado escuchando "Estoy aqui! Estoy aqui! Estoy aqui!..." y sabrias que hay alguien en la otra habitación independientemente de lo que él esté haciendo en la habitación. Si de repente no escuchas nada es que ya se ha ido.

Pues ahora substituye habitación por el navegador con tu juego, tú serias el servidor del juego y la persona de la otra habitación seria uno de los jugadores, los 10 segundos por una hora, y el "Estoy aqui" por la función que llamarías desde jquery.
__________________
Aviso: No se resuelven dudas por MP!
  #19 (permalink)  
Antiguo 14/12/2012, 06:15
 
Fecha de Ingreso: abril-2012
Mensajes: 63
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Gestionar el estado de los usuarios

Gracias a los dos. Si hubiera tenido maestros como vosotros de niño no habría salido tan atontado...
A riesgo de exponerme a que me mandéis a mantener relaciones sexuales con un pez espada epiléptico, ¿qué tipo de función es la que consigue saber si un usuario "está aquí", o da igual la función, lo importante es que no regresa (el callback no devuelve true, por ejemplo)?
  #20 (permalink)  
Antiguo 14/12/2012, 06:27
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Gestionar el estado de los usuarios

Hay que distinguir que el juego tiene dos partes: el servidor que es donde te interesa saber si hay un usuario online; y la parte cliente que se muestra gráficamente el juego al jugador.

La parte cliente ha de hacer el callback siempre cada hora sin importarle la respuesta. La parte servidora ha de insertar en la bbdd para que la parte del juego que usará la información de usuarios online tenga los datos.

Es decir, que a la parte cliente no le interesa saber que hace el servidor (en este caso). Es decir, es como si te digo "Estoy aqui". Yo te lo digo, ahora tu sabras que haces ;)
__________________
Aviso: No se resuelven dudas por MP!
  #21 (permalink)  
Antiguo 14/12/2012, 06:32
 
Fecha de Ingreso: abril-2012
Mensajes: 63
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Gestionar el estado de los usuarios

Lo intentaré este fin de semana, a ver si soy capaz de hacerlo como decís. Muchísimas gracias a los dos.

Etiquetas: estado, gestionar, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:20.