Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Diabliyo en 12 Julio 2008, 02:09 am



Título: [SOLUCIONADO] Como detecto cuando el usuario abandone la pagina ??
Publicado por: Diabliyo en 12 Julio 2008, 02:09 am
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:

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

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


Título: Re: Como detecto cuando el usuario abandone la pagina ??
Publicado por: alone-in-the-chat en 12 Julio 2008, 05:11 am
Puedes detectarlo con javascript usando el evento onclose de la pagina.

Saludos


Título: Re: Como detecto cuando el usuario abandone la pagina ??
Publicado por: ActiveSheet en 12 Julio 2008, 05:24 am
No es onunload?


Título: Re: Como detecto cuando el usuario abandone la pagina ??
Publicado por: Hans el Topo en 12 Julio 2008, 12:38 pm
el problema lo tendrás cuando habrá dos de tus páginas ya que al cerrar una dará como desconectado al usuario  :-X


Título: Re: Como detecto cuando el usuario abandone la pagina ??
Publicado por: 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.

Citar
el 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.


Título: Re: Como detecto cuando el usuario abandone la pagina ??
Publicado por: bels_mike en 13 Julio 2008, 18:38 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???????


Título: Re: Como detecto cuando el usuario abandone la pagina ??
Publicado por: Diabliyo en 16 Julio 2008, 19:45 pm
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 :'(....

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.



Título: Re: Como detecto cuando el usuario abandone la pagina ??
Publicado por: Diabliyo en 16 Julio 2008, 19:56 pm
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:

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


Título: Re: Como detecto cuando el usuario abandone la pagina ??
Publicado por: 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í
Código:
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.


Título: Re: Como detecto cuando el usuario abandone la pagina ??
Publicado por: Diabliyo en 16 Julio 2008, 22:27 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í
Código:
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 !!



Título: Re: Como detecto cuando el usuario abandone la pagina ??
Publicado por: SirLanceCC en 16 Julio 2008, 22:39 pm
Citar
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
Tu quieres hacer un método que averigue si aun está en la página. Ya te comentamos que eso no se puede por las desventajas que ya describimos. Esto no detecta nada, sólo supone que ya no está, que pasaron 5 minutos y ya se fue.

Por ejemplo en el foro siempre estoy loggueado. La cookie de mi sesión caducará como en mil años. Sin embargo si no accedo a la página después de un rato aparezco como desconectado.



Título: Re: Como detecto cuando el usuario abandone la pagina ??
Publicado por: Diabliyo en 16 Julio 2008, 22:41 pm
Citar
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
Tu quieres hacer un método que averigue si aun está en la página. Ya te comentamos que eso no se puede por las desventajas que ya describimos. Esto no detecta nada, sólo supone que ya no está, que pasaron 5 minutos y ya se fue.

Por ejemplo en el foro siempre estoy loggueado. La cookie de mi sesión caducará como en mil años. Sin embargo si no accedo a la página después de un rato aparezco como desconectado.



Ok si ya veo, solo que me estuve empenando en hacerlo de otra forma... pero ya veo que es mejor hacerlo directamente con un temporizados FIJO...

Por otra parte... si el usuario cierra la ventana ya no podre comprobar su hora actual con la hora limite maximo, entonces tendria que comprobar todos los usuarios que esten en la tabla LOG y tengan el campo fehc_logout vacio...


Título: Re: Como detecto cuando el usuario abandone la pagina ??
Publicado por: Diabliyo en 16 Julio 2008, 23:36 pm
Listo... Ya pude hacer que la sesion se cierre en un tiempo determinado, pero tambien tomando en cuenta que el usuario NO este activo en la pagina, en el caso que este activo pues le actualiza el tiempo y le agrega tiempo extra. Fue simple:

Código:
<?php
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() )
{
$trama= array(
"sesion"=>"'". session_id(). "'",
"nick"=>"'". $_SESSION["log_usr"]. "'"
);

actualizar_bdd( "LOG", $trama );
}
}

unset($log_cons);

//establece los cierres de sesion
temporizador_de_sesiones();
}

function temporizador_de_sesiones()
{
$log_cons= consultar_con( "LOG", "FECHA_LOGOUT=''" ); //consultamos sesiones abiertas
$flag=0; //bandera para saber si debemos cerrar la sesion o dejarla abierta

while( $buf= mysql_fetch_array($log_cons) )
{
//si la SESION es igual, aun esta activo en la web
if( !strcmp( session_id(), $buf["SESION"] ) )
$flag=1; //bandera activada

//si la no esta activada, entonces posiblemente no este conectado
if( $flag==0 )
{
if( ($buf["FECHA_LOGIN"]+(10*60)) < time() ) //si el tiempo se vencio se cierra la sesion
{
$trama= array(
"ID"=>"'". $buf["ID"]. "'",
"FECHA_LOGOUT"=>"'". time(). "'"
);

actualizar_bdd( "LOG", $trama );
}
}
else //entonces esta conectado, se actualiza el tiempo de sesion
{
$trama= array(
"ID"=>"'". $buf["ID"]. "'",
"FECHA_LOGIN"=>"'". time(). "'"
);

actualizar_bdd( "LOG", $trama );
}

unset($trama);
$flag=0; //desactivamos bandera
}

unset($buf);
unset($log_cons);
}
?>