Foros del Web » Programando para Internet » PHP »

duda al cerrar una ventana y borrar la session

Estas en el tema de duda al cerrar una ventana y borrar la session en el foro de PHP en Foros del Web. hola amifgos tengo un problema estoy haciendo un sistemita donde uso las sesiones para poder autentificar a los usuarios en paginas donde se requiere mi ...
  #1 (permalink)  
Antiguo 17/11/2004, 09:36
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 20 años, 9 meses
Puntos: 21
Pregunta duda al cerrar una ventana y borrar la session

hola amifgos tengo un problema estoy haciendo un sistemita donde uso las sesiones para poder autentificar a los usuarios en paginas donde se requiere mi idea es esta, cuando el usuario cierra la ventana ejecuto un proceso con el evento onBeforeUnload para(ie) y el evento onUnload para(mozilla o firefox) bueno corre de maravilla pero tengo dos problemas.

1.-Mi proceso de cierre de la ventana abre un popup que borra la sesion y luego se cierrea la ventana, el problema es que si tengo un bloqueador de popup ya mi preceso no funciono y la sesion ya no fue borrada porque el bloqueador se trago el popup jeje

2.-Cuando actualizo la pagina obviamente el proceso de eliminacion se ejecuta (si hay bloqueador de popups no me borra la sesion) y claro em borra la sesion y tengo que pedirle al usuario nuevamente su pass y login

Y lo que ando buscando es detectar cuando es un refresh o un cierre de ventana , que debo hacer?????


aqui te mando el proceso de al detectar el cierre de una ventana

$HUA=$_SERVER['HTTP_USER_AGENT'];
$HUA=strtolower($HUA);
$navegador="Desconocido";
if (stristr($HUA, "msie"))
{
$b_close='onBeforeUnload="if(ClosesWindow == true){CheckWindowClosed();}" ';
}
else
{
$b_close='onUnload="if(ClosesWindow == true){CheckWindowClosed()};"';
//$b_close='onUnload="CheckWindowClosed();"';
}



var ClosesWindow = true;
function CheckWindowClosed()
{
window.open("sesion_exit.php","close","width=10,he ight=10,top=1,left=1,resizable=no,locat ion=no,menubar=no,status=no,toolbar=no,scrollbars= 1")

}


<BODY <? echo $b_close; ?> onmouseover="ClosesWindow=false;" onmouseout="ClosesWindow=true;">
__________________
gerardo
  #2 (permalink)  
Antiguo 17/11/2004, 09:59
Avatar de lado2mx
Colaborador
 
Fecha de Ingreso: agosto-2001
Ubicación: Veracruz
Mensajes: 3.720
Antigüedad: 22 años, 8 meses
Puntos: 9
Mmm, o soy yo, o no tienes definido en donde inicia una función en PHP y otra en Javascript, recuerda que no tienes que revolver una con otra, sino te da mensajes de error y una inseguridad dentro de tu script.

Código PHP:
<?
$HUA
=$_SERVER['HTTP_USER_AGENT'];
$HUA=strtolower($HUA);
$navegador="Desconocido";
if (
stristr($HUA"msie"))
{
$b_close='onBeforeUnload="if(ClosesWindow == true){CheckWindowClosed();}" ';
}
else
{
$b_close='onUnload="if(ClosesWindow == true){CheckWindowClosed()};"';
//$b_close='onUnload="CheckWindowClosed();"';
}



var 
ClosesWindow true;
function 
CheckWindowClosed()
{
window.open("sesion_exit.php","close","width=10,height=10,top=1,left=1,resizable=no,locat ion=no,menubar=no,status=no,toolbar=no,scrollbars= 1")

}
?>

<BODY <? echo $b_close?> onmouseover="ClosesWindow=false;" onmouseout="ClosesWindow=true;">
Eso en lo que conlleva a tu script, ahora, si quieres cerrar una sesión, solo tienes que poner la función session_close(), ya con eso se cierra. Pero siento que puedes hacer mejor un redireccionador, en vez de abrir una ventana y luego cerrarla.
  #3 (permalink)  
Antiguo 17/11/2004, 10:13
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 20 años, 9 meses
Puntos: 21
tienes razon en el script

esto es php

<?
$HUA=$_SERVER['HTTP_USER_AGENT'];
$HUA=strtolower($HUA);
$navegador="Desconocido";
if (stristr($HUA, "msie"))
{
$b_close='onBeforeUnload="if(ClosesWindow == true)
{ CheckWindowClosed(); }" ';
}
else
{
$b_close='onUnload="if(ClosesWindow == true){CheckWindowClosed()};"';
}

?>

ESTO es html
<script
var ClosesWindow = true;
function CheckWindowClosed()
{
window.open("sesion_exit.php","close","width=10,he ight=10,top=1,left=1,resizable=no,location=no,menu bar=no,status=no,toolbar=no,scrollbars=1")
}
</script>


<BODY class="tabla" topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0" <? echo $b_close ?> onmouseover="ClosesWindow=false;" onmouseout="ClosesWindow=true;">


Asi se ve mejor entendible, pero amigo como ves sera posible que detecte cuando es un refresh y otro el cierre aparentemente el cierre de la ventana puede ser esto no??
__________________
gerardo

Última edición por chalchis; 17/11/2004 a las 10:15
  #4 (permalink)  
Antiguo 17/11/2004, 10:46
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Asi se ve mejor entendible, pero amigo como ves sera posible que detecte cuando es un refresh y otro el cierre aparentemente el cierre de la ventana puede ser esto no??
El tema del control de expiración de una sesión no deberías dejarlo en manos de "javascript" ... Que yo sepa no hay control sobre si estás recargando la página o es una petición directa.


PHP y sus sesiones ya gestionan los tiempos de expiración vía directivas:
session.gc_maxtimelife

Y todo depende de como propagues el SID (si por cookies o por el URL; manualmente o automáticamente) .. pero al final del todo la directiva que "manda" es la que indico.

PHP al pasar ese tiempo ya "mata" la sesión (la pasa al estado "garbage": basura) listo para ser borrado por otro proceso que hace PHP referente y controlado por la directiva:
session.gc_probality
que, indica el n° de veces (en porcentaje) que se ha de usar (o llamar) a session_start() para que actue dicho proceso y borre físicamente del servidor las sesiones que ya no son válidas (el SID de estas) pero sigue ahí (en el servidor) el archivo que PHP crea (por defecto .. si no cambias el "handler")

Si quieres implementar sistemas de "cuando salió" el usuario del sistema (de tu aplicación) lo que se suele hacer es "confiar" en tiempos de expiración .. así que la fecha que salió tu usuario será un máximo de lo que marque session.gc_maxtimelife + la última iteracción con el servidor y el último registro de esa interacción con el servidor .. es decir, se actualiza esta fecha de "en el sistema" a cada petición de una página de tu aplicación (incluido recargas y demás ). Este es el principio básico del que se basa los contadores de "usuarios activos" que veras en muchos sitios (incluidos las FAQ's de este foro PHP).

Un saludo,
  #5 (permalink)  
Antiguo 17/11/2004, 14:07
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 20 años, 9 meses
Puntos: 21
Pregunta mmok otra duda

perdona mi ignoracia pero entonces amigo(s) que me aconsejan para poder llevar el control y borrado de sessiones ,saber que sesiones estan realmente activas, porque al cerrar la ventana de mi sitio borro la session y es para no esperar al proceso de recoleccion de basura pero bueno.

Tengo un modulo donde veo que usuarios tengo en linea, aqui cuando el usuario se autentifica se crea la sesion y se realiza una insercion en una tabla para los usuarios en linea, los datos que almaceno son el session_id y datos del usuario que se crearon en la sesión

Menciono esto porque se relaciona con el borrado de sesion que hago al cerrar el sitio o al cambiar a otro.

En este modulo de quien esta en linea checa el session_id que se registro exista en la carpeta donde se crean los tmp si no existe al ser el refresh(que es cada 10 seg)borra el registro de la tabla y entonces podria decirse que el usuario no esta en linea.

Pero si descarto mi proceso de eliminar la sesión al cerrar la ventana no va ver coherencia en el modulo de usuarios en linea ,como puedo manejar ¿que las sessiones estan realmente activas?.Porque si quito ese proceso, en el listado de usuarios en linea seguira en linea hasta que el proceso de recoleccion actue que me aconsejan.??????????????
__________________
gerardo

Última edición por chalchis; 17/11/2004 a las 14:10
  #6 (permalink)  
Antiguo 17/11/2004, 14:41
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
perdona mi ignoracia pero entonces amigo(s) que me aconsejan para poder llevar el control y borrado de sessiones ,saber que sesiones estan realmente activas, porque al cerrar la ventana de mi sitio borro la session y es para no esperar al proceso de recoleccion de basura pero bueno
Con sesiones se trabaja como te he descrito .. no es lo mismo que el SID expire que el archivo físico de esa sesión sea borrado por el proceso de "garbage".

Por ejemplo .. si propagas el SID en cookies (session.use_cookies) y estas están ajustado su tiempo de expiración a "0" .. Si cierras tu última ventana de tu sitio .. la cookie muere y con el el SID que hace el enlace de ese "cliente" con el "servidor".

Cita:
Tengo un modulo donde veo que usuarios tengo en linea, aqui cuando el usuario se autentifica se crea la sesion y se realiza una insercion en una tabla para los usuarios en linea, los datos que almaceno son el session_id y datos del usuario que se crearon en la sesión

Menciono esto porque se relaciona con el borrado de sesion que hago al cerrar el sitio o al cambiar a otro.
Si tienes problemas con el SID "regenarción" .. tienes la función:
session_regenerate_id()

Podrías usar esa función al hacer un login tu usuario (por si cambia en una misma sesión de usuario) .. Eso sí . .habiendo borrado también tus datos de esa sesión o usando un session_destroy() y esa función para que no tome los valores anteriores si algo dejastes en la sesión anterior.

Cita:
En este modulo de quien esta en linea checa el session_id que se registro exista en la carpeta donde se crean los tmp si no existe al ser el refresh(que es cada 10 seg)borra el registro de la tabla y entonces podria decirse que el usuario no esta en linea.
Si bien en tu caso particular por los permisos que tienes sobre tu servidor y pocas restricciones puedes acceder a tu "tmp" de sesiones para contar "archivos" (trala la xD) .. en otras condiciones no vas a poder hacer eso (en general en cualquier configuración algo "decente" segura .. no podrás "salir" con PHP y sus funciones de archivos u otras funciones del sistema para acceder a ese directorio).

Te hice el comentario que en las FAQ's de este foro tienes la solución al tema .. con su "margen de error" pues se trata de asumir ciertos tiempos que debes considerar como que tu usuario está "inactivo" (que no "pide" páginas al servidor vía links, refrescos .. formularios que envia .. etc).

Cita:
Pero si descarto mi proceso de eliminar la sesión al cerrar la ventana no va ver coherencia en el modulo de usuarios en linea ,como puedo manejar ¿que las sessiones estan realmente activas?.Porque si quito ese proceso, en el listado de usuarios en linea seguira en linea hasta que el proceso de recoleccion actue que me aconsejan.??????????????
Arriba te he comentado como solventarlo.

Un saludo,
  #7 (permalink)  
Antiguo 17/11/2004, 18:02
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 20 años, 9 meses
Puntos: 21
esta es la forma en que uso las sesiones

ahh ok men, disculpa, si repito lo mismo, entonces la mejor opcion de usar las sesiones y llevar un control seria atravez de cookies verdad?

Mira
Una vez que el usuario se autentifico correctamente creo asi la sesion
session_start();
$_SESSION["us"][0]=$dato1;
$_SESSION["us"][1]=$dato2;
$_SESSION["us"][2]=$dato3

y en las paginas donde requiero la sesion la llamo asi
include('checar.php');//ejemplo
session_start();
$usuario=$_SESSION["us"][0];

en el include
checo si existe la session si no
hago un redireccionamiento

asi es como las uso que opinas
__________________
gerardo

Última edición por chalchis; 17/11/2004 a las 20:19 Razón: mira asi uso yo las sessiones
  #8 (permalink)  
Antiguo 18/11/2004, 06:34
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
.. mm .. Las cookies si usas sesiones no es más que el método para propagar el SID (Identificador Único de Sesión) .. Para eso tendrás que asegurarte en tu configuración de PHP como propagas el SID y como lo hace tu aplicación .. Por lo que comentas .. no lo haces tu a mano y dejas que PHP lo haga .. ahora .. abría que ver si lo hace por cookies o por el URL (session.use_cookies = ON U session.use_trans_sid = ON )

El ejemplo que mencionas en tu checar.php si vas a comprobar la existencia de tu sesión . .deberías hacer:

checar.php
Código PHP:
<?
session_start
();
if (isset(
$_SESSION['us'])){
  
header ("Location: error.php");
  exit;
}
?>
Y el session_start() ya no tienes que incluirlo nuevamente en el código de la página que va a usar sesiones pues ya lo haces en el "checar.php" que siempre vas a incluir en las páginas que requieran autentificación.

Un saludo,
  #9 (permalink)  
Antiguo 18/11/2004, 08:18
 
Fecha de Ingreso: julio-2004
Ubicación: Buenos Aires
Mensajes: 35
Antigüedad: 19 años, 9 meses
Puntos: 0
al leer esto me surigió una duda... la manera en q yo trabajo con las sesiones es la siguiente:
1.- genero un id de session en funcion al usuario q ingrese... ej( $idsesio=md5($idusuario)
2.- conservo como variable sesion el timestamp del momento q se inicia la sesion
3.- propago manualmente por la url $idsesion
4.- continuo la sesion con un session_id($idsession); session_start();
5.- controlo si la diferencia entre la hora de inicio y la hora en q se continuo es menor que la una duracion preestablecida. si es menor continuo y sino destruyo esa sesion

no se si fui claro en lo anterior, la pregunta es: ¿es eficiente lo q hago?,¿hay otra manera de hacerlo mejor?

desde ya gracias...

Dago

Pd: casi nunca posteo nada, siempre consulto el foro como referencia, por eso aprovecho la opurtunidad para saludar y agradecer a Cluster por su inestimable ayuda para con nosotros los desarrolladores..
  #10 (permalink)  
Antiguo 18/11/2004, 10:33
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 20 años, 9 meses
Puntos: 21
OK mira asi tengo mis datos en php.ini

si de hecho asi hago mi validacion ,si la sesión existe
session_start();
$login=$_SESSION["us"][0];
if($login==null)
{
echo '<SCRIPT language="Javascript">
top.location.href("login.php")
</script> ';
}

Y en cuanto en ephp.ini lo tengo asi

session.use_cookies On
session.use_only_cookies On
session.use_trans_sid Off

obviamente estoy usuando register_globals Off
¿???????
__________________
gerardo
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 17:32.