entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Sesiones permanentes o duraderas y login con facebook

Hola muy buenas y enhorabuena por el gran cambio de look, es impresionante.
Parece que no estoy pillando bien esto de las sesiones con php.

Estoy intentando que cuando una persona se loguea en mi pagina web, que dure permanentemente o por un largo tiempo como hacen muchas paginas como Facebook que hasta que no elimino la Session o elimino todo el historial del navegador no tengo que volver a loguearme.

Vamos al grano:

Me estoy logeando con facebook en mi web obtengo todos los datos con la api y creo las sesiones, pero he hecho una prueba y al cabo de dos horas o menos la Session ha muerto, porque he salido a la calle un momento sin cerrar el navegador y cuando he vuelto ya había muerto la Session.
¿Como lo puedo hacer para que sea más duradera la Session?

    session_destroy();
    $tiempo=time()+60*60*24*30; // 1 año
    session_cache_expire($tiempo);
    $cache_expire = session_cache_expire();
    session_start();
    session_set_cookie_params($tiempo);
    $_SESSION['idusuario'] = $userQuery['idusuario'];
    $_SESSION['email'] = $userQuery['email'];
    $_SESSION['usuario'] = $userQuery['usuario'];
    $_SESSION['url_usuario'] = $userQuery['url'];
    $_SESSION['ultima_entrada'] = $userQuery['fecha_ultima_entrada'];
    $_SESSION['provider'] = $provider; //facebook
    $_SESSION['identificador'] = $identificador;

Espero puedan ayudarme.
Saludos!!!

2 Respuestas

2votos

Leonardo-Tadei Puntos227320

Hola José,

hay varias cuestiones en tu código. Primero:

$tiempo=time() + 60 * 60 * 24 * 30;

606024*30 no es un año, es un mes expresado en segundos. La variable $tiempo tendrá ahora un número entero que representará el momento actual más 1 mes.

Luego cuando hacés:

session_cache_expire($tiempo);

Estás indicando que la sesión en el servidor perdure 1 mes. Tenés que hacer este llamado cada vez antes de llamar a session_start().

Luego, sabiendo que la sesión en PHP se mantiene gracdias a una cookie en el cliente, hacés

session_set_cookie_params($tiempo);

Pero esto no tiene efecto, porque tiene que ser llamado antes de session_start(); y por tanto, el valor vigente será el de PHP.INI que expirará la sesión en el default de la configuración.

Por otra parte session_set_cookie_params($tiempo); recibe como parámetro cuanto tiempo dura la cookie, y no en qué fecha se vence, por lo que lo correcto sería pasarle como parámetro algo como 60 60 24 *30 para que dure un mes, sin agregarle el valor de time().

Saludos cordiales!

0voto

chiqui3d comentado

Muchísimas gracias Leonardo tengo varias dudas más.
Por cierto si es verdad era 365 para un año.

  1. Tengo que definir también este parametro
    ini_set(session.gc_maxlifetime) para que dure un año?
  2. Porque despues de crear las sessiones del login creo también una cookie con: setcookie("codigo_jl",$valor, $tiempo); y luego intento mostrarla con echo $_COOKIE['codigo_jl']; y no me muestra nada, en blanco.

Un abrazo y espero me puedas aclarar esto.

0voto

Leonardo-Tadei comentado

Hola José,
1) no es necesario dado que esto mismo es lo que pasa con session_cache_expire($tiempo);
2) tendría que ver el código que hace esto para responderte. A priori, fijate estar llamando a setCookie() antes de emitir ninguna salida y antes del session_start(). Para qué guardas datos en un cookie si podés mantener datos en las sesiones?

0voto

chiqui3d comentado

Gracias, pero nada. No se si es problema de configuración del servidor o no se. Pero nada la session no dura ni dos horas. Te lo adjunto:

    $tiempo=time()+60*60*24*365;
    $tiempo_params=60*60*24*365;
    session_destroy();
    session_cache_expire($tiempo);
    $cache_expire = session_cache_expire();
    session_set_cookie_params($tiempo_params);
    session_start();
    $_SESSION['idusuario'] = $userQuery['idusuario'];

Leornardo estaba probando las cookies por eso te preguntaba.

0voto

Leonardo-Tadei comentado

Hola José,

revisá dos cosas: una, que luego del session_start() hacé un print de $cache_expire a ver si tiene el valor que esperás; otra, revisando las cookies del navegador, fijate los valores de los cookies de la sesión para ver si están bien seteados.

0voto

chiqui3d comentado

Hola Leonardo y de nuevo gracias por todo.
He tardado en responder porque he estado haciendo pruebas y nada.
Lo que me imprime $cache_expire es 1416948557.
Te explico como va el sistema haber si puedes ver el problema:
Tengo un archivo llamado template que siempre va incluido en todas las paginas "no utilizo nigun framework" es php a pelo. En ese archivo tengo también el session _start() siempre.
Es decir así::

        if (!isset($_SESSION))  {   
         session_cache_expire($tiempo);
        $cache_expire = session_cache_expire();
        session_set_cookie_params($tiempo_params);  
        session_start();  
}

Lo hago asi porque una vez que loguea si no lo pongo en el template se pierde la session y los id de los usuarios.
Bueno y despues en el login cuando se van loguear lo mismo que antes

 session_cache_expire($tiempo);    
$cache_expire = session_cache_expire();   
 session_set_cookie_params($tiempo_params);   
 session_start();    
$_SESSION['idusuario'] = $fila['id'];    
$_SESSION['id_usuario'] = $fila['id']; 
....     header("location: "...");

Espero que esto ayude un poco más o si no ya no se que hacer.
Un saludo

0voto

Leonardo-Tadei comentado

Hola José,

fijate por favor en el navegador la cookie instalada y poné acá los valores que tiene. No te lo puedo asegurar sin correr todo el código, pero es probable que el tiempo de vda de la cookie sea menor al de la sesión, y al desaparecer la cookie no se restaura la sesión original en el session_start() sino que se crea una nueva.

Probá también elever el tiempo de recorrida del recolector de basura

ini_set("session.cookie_lifetime","216000");
ini_set("session.gc_maxlifetime","216000");
session_start();

Seguimos!

0voto

chiqui3d comentado

Muchas gracias Leonardo.
Ahora si parece que va bien, despues de unos días sigo logueado y viendo los parámetros de la cookies.
Bueno ademas de poner los parámetros de init_set, he eliminado todo start session que habia por hay y solo he dejado el del template y todo bien!!!

Gracias Leornardo y un cordial saludo

1voto

christian_avalos Puntos1370

Yo no hago una session_cache_expire, ya que la sesion se elimina automaticamente al cerrar el navegador

El tiempo de vida de una sesión puede ser seteado por el php.ini por la directiva
session.cookie_lifetime que si es 0, entonces dura hasta que el navegador se cierre.
Otro método es por medio de la función session_set_cookie_params que su primer parámetro (y obligatorio) es de int tiempo."

Por cierto, puedes ayudarme para logear con facebook en mi web?

0voto

chiqui3d comentado

Si yo estoy utilizando la librería http://hybridauth.sourceforge.net/ hay esta toda la documentación si tienes alguna duda pues me avisas

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta