¿Cuál es la diferencia entre session_unset () y session_destroy () en PHP?

88

De la documentación de php.net :

session_destroy : destruye todos los datos registrados en una sesión

session_unset - Libera todas las variables de sesión

Mi pregunta de tres partes es:

Las dos funciones parecen muy similares.
¿Cuál es realmente la diferencia entre los dos?

Ambos parecen eliminar todas las variables registradas en una sesión. ¿Alguno de ellos realmente destruye la sesión en sí? Si no es así, ¿cómo lo logras (destruye la sesión en sí)?

¿Es correcto que ninguna de las dos funciones borre la cookie de sesión en el cliente?

Johan
fuente

Respuestas:

144

session_unsetsimplemente borra la $_SESSIONvariable. Es equivalente a hacer:

$_SESSION = array();

Por lo tanto, esto solo afecta a la $_SESSIONinstancia de la variable local , pero no a los datos de la sesión en el almacenamiento de la sesión.

En contraste con eso, session_destroydestruye los datos de la sesión que están almacenados en el almacenamiento de la sesión (por ejemplo, el archivo de sesión en el sistema de archivos).

Todo lo demás permanece sin cambios.

Gumbo
fuente
@Gumbo ¿No hay algún problema con que session_unset () esté obsoleto ahora? Revisé esto y no funcionó para mí.
Navneet
@hakre ¿cuál es la advertencia?
Ir a
4
@GoTo: Ese session_unset se usó para desarmar variables globales registradas como variables de sesión, como era común en PHP 4. El uso de esa función a día de hoy es anacrónico y no es necesario. La única razón por la que todavía está en PHP es probablemente la compatibilidad con versiones anteriores y nada más. Si escribe código nuevo, no debe usarlo. Si lo encuentra dentro del código, debe eliminarlo junto con las llamadas a session_register () y el resto de las funciones de manejo de variables de sesión de PHP 4, a menos que esté tratando explícitamente con código PHP 4.
hakre
5
Aún así es confuso: descríbalo local $_SESSION variable instance vs session data in the session storage. Como sé, hay 1000 personas como yo que no entendieron su punto. Gracias
Pratik
1
Tu respuesta es demasiado confusa. Considere editarlo, porque todavía creo que ambos están destruyendo la sesión
Pratik
17

session_destroy(); está eliminando toda la sesión.

session_unset();elimina solo las variables de la sesión; la sesión aún existe. Solo se truncan los datos.

Xamael
fuente
15
session_unset();

Simplemente borre todos los datos de todas las variables de sesión.


session_destroy();

Eliminar todas las sesiones.


Ejemplo :

session_start();
session_destroy();     
$a = "1234";
$_SESSION[a] = $a;

$_SESSION[a]es NULL.


session_start();
session_unset();     
$a = "1234";
$_SESSION[a] = $a;

$_SESSION[a]es 1234.


Entonces, usaré:

session_start();
session_destroy();   
session_start();  
$a = "1234";
$_SESSION[a] = $a;
SLyHuy
fuente
2
en su ejemplo medio -> session_unset();NO está haciendo nada ya que todavía puede usar session of $_SESSION["a"] , entonces, ¿para qué sirve?
Pratik
1
$_SESSION[a]debería ser $_SESSION['a'] y, a diferencia de lo que dijo, esto NO es NULO en su primer ejemplo
Istiaque Ahmed
5

session_unset()borrará la $_SESSIONvariable (como en array()), pero no tocará el archivo de sesión. Pero cuando termina el guión; el estado del $_SESSIONse escribirá en el archivo. Luego borrará el archivo pero no lo eliminará. Cuando lo use session_destroy(), no tocará $_SESSION(Usar var_dump($_SESSION)después session_destroy()), pero eliminará el archivo de sesión, por lo que cuando el script salga, no habrá un archivo para escribir el estado del $_SESSION.

kaushik
fuente
0

session_destroy()eliminará la sesión después de mover la página y session_unset()eliminará la sesión cuando se ejecute el código.

Radian Yusuf Mahendra
fuente
0

Traté de usar el session_unset($_SESSION['session_name'])pensamiento de que solo desarmará el nombre de sesión específico o individual / único. Pero usar session_unset($_SESSION['session_name'])solo desarmará todos los nombres de sesión. El código correcto para usar es solo unset($_SESSION['session_name'])si desea desarmar un solo nombre de sesión.

Marvin
fuente
0

session_start (); # creará una matriz virtual (asociativa) en la memoria en tiempo real del navegador

dos elementos añadidos

> $_SESSION['me'] = "Yadab";  
> $_SESSION['you'] = "Avi";
>
> print_r($_SESSION); #will give, array( "me"=>"Yadab", "you"=>"Avi" )

test1

> unset($_SESSION['me']); #only 'me' variable is removed fully (index & value) 
> print_r($_SESSION); #now the array is Array("you"=>"Avi")

test2

> session_destroy(); #will unset the values of all session variables, but indexes exists 
> print_r($_SESSION); #Output, Array("you"=>undefined)
> #but some browser can store the value in cookies

test3

> session_unset(); #will unset all the main variables not only the values 
> print_r($_SESSION); #that means session array is now empty, like Array()

probar el bloque 1, 2 o 3 en individualmente comentando a otros

Yadab Sd
fuente
-2

Creo que session_destroy () y session_unset () deben usarse al mismo tiempo para asegurarse de que los datos de la sesión se eliminen con seguridad.

Riaj Mahmud Rasel
fuente
Creo que significa que no estás seguro de la respuesta. Esto debería ser un comentario, no una respuesta.
Shaiful Islam
4
session_unset()después session_destroy()sería inútil. Úselo session_unset()para borrar todas las claves y valores de la superglobal $ _SESSION, o use session_destroy()para eliminar toda la sesión; no use ambos solo para "asegurarse", confíe en que la función hará su trabajo.
Redburn
@redburn session_destroy()no desarma la var superglobal sess hasta que sale de la página actual.
Yousha Aleayoub