2012-01-12 61 views
5

Entiendo que PHP almacena el ID de sesión de un usuario en una cookie llamada "PHPSESSID" que se almacena en el navegador del cliente y se compara con la sesión en el servidor para poder relacionar el 2. Después de cerrar el navegador desaparece pero la cookie en el cliente permanece. ¿Es posible usar esta cookie para restaurar la sesión anterior? ¿O todos los datos de la sesión se eliminan del servidor en el momento en que el cliente cierra su navegador?¿Cómo restaurar una sesión de PHP?

que tenía esto en mi página en primer lugar:

session_start(); 
$_SESSION['message'] = 'Hello'; 

echo $_SESSION['message']; // outputs hello 

entonces me cambiaron la página a:

$old_session = session_id(); 
session_id($old_session); 
session_start(); 

echo $_SESSION['message']; 

Entonces cerré el navegador y abierto de nuevo a esta página y tengo estos errores:

Warning: session_start() [function.session-start]: The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in C:\xampp\htdocs\localhost\test.php on line 5 

Notice: Undefined index: message in C:\xampp\htdocs\localhost\test.php on line 7 

¿Cómo recupera exactamente la información de la sesión anterior después de cerrar el navegador? ¿Es posible?

+1

'Después de cerrar el navegador, la información de la sesión desaparece pero la cookie en el cliente permanece. --- no es correcto. En la mayoría de los casos, la duración de la cookie de ID de sesión se establece en "antes de que el navegador no se cierre". '$ old_session = session_id(); session_id ($ old_session); '--- este código no tiene sentido – zerkms

+0

http://php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime – j08691

+0

A menos que esté mirando a través de la ventana del usuario, su servidor no tendrá idea cuando cierre su navegador (AJAX tampoco lo garantizará). El servidor simplemente elimina los datos de sesión que se consideran "antiguos". – webbiedave

Respuesta

4

Una sesión hace exactamente lo que dice en la lata: existe durante la sesión del cliente. Una sesión de navegación por definición (como la hay) finaliza cuando cierra el navegador.

Las sesiones basadas en cookies funcionan estableciendo una cookie que tiene una vida útil definida en PHP como 0 - esto significa que el navegador debe destruir la cookie cuando se cierra el navegador. Una vez que la cookie ha sido destruida, la ID de la sesión no se envía en ninguna solicitud subsiguiente del servidor, por lo que los datos de la sesión no estarán disponibles en su script PHP.

Sin embargo, los datos de la sesión no se destruyen en el servidor en el momento en que el usuario cierra el navegador, como sugirió; esto es imposible porque el cliente no notifica al servidor que se ha cerrado. En cambio, los datos de la sesión en el lado del servidor tienen un TTL (tiempo de vida) que tiene un valor predeterminado de 15 minutos. Después de que esto haya expirado, los datos pueden ser eliminados en cualquier momento por el recolector de basura de la sesión. En teoría, esto podría ser un tiempo considerable, pero en la práctica en un servidor ocupado, los datos serán eliminados dentro de un par de minutos después de la expiración del TTL.

Sin embargo, PHP no puede hacer disponibles los datos de la sesión a menos que tenga la ID de la sesión, y no tendrá la ID de sesión si la cookie ha sido destruida, lo que como digo debe ocurrir cuando el usuario cierra su navegador.

Así que la respuesta corta a la pregunta How can I restore a PHP session? es: Puede no

+1

Veo, es bueno saber que los datos del servidor no se eliminan cuando se cierra el navegador. Pude solucionar la necesidad de restauración creando otra cookie y almacenando el session_id() actual en ella. Luego, cuando se reabrió el navegador, hice session_id ($ _ COOKIE ['old_session']); y fue capaz de recuperar la información de la sesión anterior. – TK123

1

session_start set's a cookie.

la cookie tiene un parámetro cookie-lifetime

por defecto la duración de la cookie se establece en 0

0 medios hasta que el navegador cerrado

2

Esto puede o no ser una respuesta que busca.

Hasta donde yo sé, no puede "restaurar" una sesión basada en la cookie de sesión. Lo que hago es almacenar una cookie con la identificación del cliente, nombre de usuario y contraseña, salado y hash. También guardo otro con su identificación. Compruebo las cookies cuando visitan el sitio, las valido una contra la otra y luego las inicio de sesión automáticamente. Si bien esto no "restaura" su sesión, les permite permanecer conectado en mi sitio cuando cierran el navegador. Así fue como pensé hacerlo, y me imagino que si alguien secuestrara o viera las cookies de otro usuario, sería casi imposible descifrarlo con la sal que utilicé. La única información que obtendrían es la identificación del usuario.

+1

¿Por qué no? La ID de la sesión es el valor almacenado en la cookie. El nombre de la cookie de sesión es 'session_name()', y el valor almacenado en él es 'session_id()'. –

+0

Nunca lo había hecho así porque pensé que las sesiones se eliminarían del servidor demasiado pronto (tal vez unas horas más o menos de inactividad, a menos que tuviera que cambiar la configuración), y el uso de un método de cookies permitiría que la sesión original ser borrado pero permanecer conectado. –

+1

la cookie de la sesión php no almacena nada más que la identificación de la sesión. si el archivo de la sesión se ha ido, entonces la sesión se ha ido y se creará un nuevo archivo, dejando una sesión en blanco. –

1

La respuesta aceptada aquí no debe ser aceptada. Ciertamente puede recuperar una sesión siempre que no se haya borrado. Realmente es así de simple.

<?php 
    session_id($the_id_of_the_session_you_want_to_reopen); 
    session_start(); 
?> 

Encontré la respuesta here.