[SOLUCIONADO] Como detecto cuando el usuario abandone la pagina ??

Iniciado por Diabliyo, 12 Julio 2008, 02:09 AM

0 Miembros y 1 Visitante están viendo este tema.

Diabliyo

Hola:

En mi sistema web tengo un Sistema de Log en donde el procedimiento es el siguiente:

1- Cuando el usuario accede a la pagina, guardo en la base de datos cierta informacion de el, por ejemplo:

<?php
$trama
= array( 
"nick"=>"'visitante'', 
"
ip"=>"'a.b.c.d'", 
"
navegador"=>"'AbcDe'", 
"
tiempo_login"=>"'". time(). "'" );

insertar_bdd( "
LOG", $trama );
?>


2- Cuando el mismo usuario se conecta a la pagina (usando su username y password, vaya logearse), entonces actualizo el LOG:

<?php
$trama
= array( 
"ip"=>"'a.b.c.d'"
"nick"=>"'"$_SESSION["log_usr"]. "'"  );

actualizar_bdd"LOG"$trama );
?>



Pero bueno, tengo un segundo campo en la base de datos LOG que es tiempo_logout, ya que tiempo_login toma el tiempo desde que accedio al sitio web, pero como pudo hacerle para registrar el tiempo_logout asumiendo que el usuario simplemente cierra el navegador o abandona la pagina sin cerrar su sesion !!???...

En realidad ya tengo mas de 7 horas programando y me he quedado trabado en esta parte jejeje, creo que ya me sature, hasta me duele el cuello, en fin... alguna idea !??

bye bye

alone-in-the-chat

Puedes detectarlo con javascript usando el evento onclose de la pagina.

Saludos
Because maybe
You're gonna be the one that saves me
And after all
You're my wonderwall
d[n_n]b

ActiveSheet


Hans el Topo

el problema lo tendrás cuando habrá dos de tus páginas ya que al cerrar una dará como desconectado al usuario  :-X
 

SirLanceCC

Creo que lo normal sería establecer un tiempo de espera. Por ejemplo 5 minutos. Si no se detecto actividad de ese usuario en cinco minutos darlo por offline. Si realizó alguna ación darle otros 5 minutos.

Citarel problema lo tendrás cuando habrá dos de tus páginas ya que al cerrar una dará como desconectado al usuario
Eso es un problema. Además ¿que pasaría si el navegador se cierra por un error o falla de luz? No se ejecutaría el evento de salida.

bels_mike

Cita de: SirLanceCC en 12 Julio 2008, 16:44 PM
Creo que lo normal sería establecer un tiempo de espera. Por ejemplo 5 minutos. Si no se detecto actividad de ese usuario en cinco minutos darlo por offline. Si realizó alguna ación darle otros 5 minutos.

Si yo creo que se lo mejor, es el metodo que utilizan muchas webs, y bueno infinidad de aplicaciones como phpBB,Nuke,e107..... la idea es decir... usuariso conectados (Satos de los ultimos 5 minutos) o algo asi y haces que se muestren los usuarios q haya entrado en una de tus webs despues de la hora menos 5 minutos xD se me entiendes???????

Diabliyo

Creo que si utilizo un evento que tome la senal al cerrarse la pagina (onclose), entonces el problema seria como lo menciona Hans el Topo, y esto generaria una insercion masiva de datos extras en el LOG y ocacionaria el crecimiento de la TABLA LOG considerablemente :S.... Y sin menciona tambien lo que opino SirLanceCC que al cerrase el navegador por algun error, muerte del proceso o fallo de la luz, entonces la session nunca seria detectada como cerrada y permaneceria abierta :S !... Tendriamos en el LOG sesiones abiertas en muchos casos :'(....

Cita de: SirLanceCC en 12 Julio 2008, 16:44 PM
Creo que lo normal sería establecer un tiempo de espera. Por ejemplo 5 minutos. Si no se detecto actividad de ese usuario en cinco minutos darlo por offline. Si realizó alguna ación darle otros 5 minutos.

En cambio eso si suena un poco mas razonable, fiable y manejable, ya que segun bels_mike es un metodo utilziado en otras aplicaciones.


Diabliyo

#7
Bueno... Ya entrando en materia y tratando de enfocar el sistema de LOG para detectar inicio y cierre de sesiones mediante el metodo que plasmo SirLanceCC el cual seria: "Una vez obtenido el LOG de una sesion, establecer un parametro temporizador a 5 minutos (es un ejemplo), y se estuviera checando constantemente dicho tiempo, en el caso que el usuario no muestre actividad pues la sesion se da por cerrada, de lo contrario cada que se muestre movimiento se establecen los 5 minutos apartir de la deteccion de su movimiento en el web"

Pero me gustaria saber si pueden colaborar conmigo en esta parte, asi que les explicare lo basico en mi sistema:

Cuando el usuario accede al sitio se le asigna una SESSION y despues se llama a una funcion, esta es deamon_logd(), la cual consiste en retomar la SESSION actual y comprobar su existencia en la tabla LOG si esta no existe entonces se procede a insertar los datos del usuario en la tabla (ip, sesion, navegador, sistema operativo, nick y fecha_login). Como es de suponerse, si el usuario aun no se logea al sitio web (con su username y password) el nick que le corresponde en la insercion que se realizo en la tabla LOG es el de Visitante, por otro lado, si el usuario deside logearse entonces solo se realiza una actualizacion a la tabla LOG modificando el nick por el nick que le corresponde en su registro del sitio web.

Mi problema surgio al momento de decirme, Y como detecto o determino si el usuario se salio de la pagina para actualiza la tabla LOG y escribir los datos en fecha_logout correspondiente a la session del usuario que se salio.

En fin, ustedes me propusieron establecer un temporizados, pero de momento no se me ocurre como manejar este temporizador dentro la funcion deamon_logd(), asi que les coloco el codigo de la funcion ya mencionada para ver que podemos hacer, de todo modos estare pensando haber se le puede hacer para ahorrar recursos, sea mas rapido el procedimiento y no genere errores o confusiones:

function deamon_logd()
{
$ip= $_SERVER['REMOTE_ADDR'];
$nav= get_browser();

//Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14

$log_cons= consultar_con( "LOG", "SESION='". session_id(). "'" );

if( mysql_num_rows($log_cons)==0 ) //no existe la SESION, esta entrando nuevo usuario
{
//recolectamos informacion
while (list($key, $val)=each($nav))
{
if( !strcmp($key, "parent" ) )
$navegador= $val;
else if( !strcmp($key, "platform" ) )
$so= $val;
}

$trama= array(
"nick"=>"'Visitante'",
"ip"=>"'". $ip. "'",
"so"=>"'". $so. "'",
"navegador"=>"'". $navegador. "'",
"sesion"=>"'". session_id(). "'",
"fecha_login"=>"'". time(). "'"
);

insertar_bdd( "LOG", $trama );
}
else //la SESION ya existe
{
if( usuario_legitimo() ) //si el usuario esta logeado al sistema web
{
$trama= array(
"sesion"=>"'". session_id(). "'",
"nick"=>"'". $_SESSION["log_usr"]. "'"
);

actualizar_bdd( "LOG", $trama ); //se actualiza el nick
}
}

unset($log_cons);
}

SirLanceCC

A ver... no te entendí bien. Pero yo una vez hice algo parecido y es mas o menos así.

Cada que el usuario visite una página se actualiza el campo fecha_login con la fecha y hora actual.

Ahora si quieres saber si el usuario está online haces algo así
if fecha_login + 5mins > hora_actual:
    está online
else
    está offline


Espero que te sea de ayuda. No te entiendo bien y tampoco nunca he manejado las sesiones php, pero hacer un daemon real se me hace un poquillo complicado.

Diabliyo

Cita de: SirLanceCC en 16 Julio 2008, 20:53 PM
A ver... no te entendí bien. Pero yo una vez hice algo parecido y es mas o menos así.

Cada que el usuario visite una página se actualiza el campo fecha_login con la fecha y hora actual.

Ahora si quieres saber si el usuario está online haces algo así
if fecha_login + 5mins > hora_actual:
    está online
else
    está offline


Espero que te sea de ayuda. No te entiendo bien y tampoco nunca he manejado las sesiones php, pero hacer un daemon real se me hace un poquillo complicado.

Ok si.. has echo la parte mas facil y ovia, pero el problema (segun yo) es como determinar si esta o no esta para despues determina si se tiene que actualizar para agregarle 5 minutos mas... ??..

Vaya tu codigo lo unico que haria es:

1- El usuario tiene un login a las 10:00
2- Entra la condicion y hace esto  if( ((10)+5) > 11:00)  //asumiendo que son las 11:00, como 10+5 es mayor que 11, entonces se asume que esta dentro, por lo cual esta condicion no veo el caso que se haga de esta forma, ya que si esta aun dentro del tiempo limite pues no veo la necesidad de cerrar la sesion ni nada !!...
3- Despues tu dices solamente else esta ofline, pues si, pero eso simplemente no dice nada ni ayuda mucho, vaya, si el tiempo (10+5) se queda por abajo del tiempo actual entonces se supone que esta aparte debemos detectar si esta aun o no existente su session... como se haria eso ???...

En fin, tu ejemplo no es claro y mucho menos tu explicacion :S !!!

Por otro lado mi explicacion dad esta mas clara que el agua, seria imposible que no entendieras la explicacion que di en el POST anterior :S !!