Qual è la differenza tra session_unset () e session_destroy () in PHP?


88

Dalla documentazione di php.net :

session_destroy - Distrugge tutti i dati registrati in una sessione

session_unset - Libera tutte le variabili di sessione

La mia domanda in tre parti è:

Le due funzioni sembrano molto simili.
Qual è veramente la differenza tra i due?

Entrambi sembrano eliminare tutte le variabili registrate in una sessione. Qualcuno di loro distrugge effettivamente la sessione stessa? In caso contrario, come si esegue questa operazione (distruggere la sessione stessa).

È corretto che nessuna delle due funzioni cancella il cookie di sessione sul client?

Risposte:


144

session_unsetcancella solo la $_SESSIONvariabile. È equivalente a fare:

$_SESSION = array();

Quindi questo influisce solo sull'istanza della $_SESSIONvariabile locale ma non sui dati della sessione nella memoria della sessione.

Al contrario, session_destroydistrugge i dati della sessione memorizzati nella memoria della sessione (ad es. Il file della sessione nel file system).

Tutto il resto rimane invariato.


@ Gumbo Non c'è qualche problema con session_unset () che è deprecato ora? Ho controllato e non ha funzionato per me.
Navneet

@hakre qual è l'avvertimento?
Vai al

4
@GoTo: Quel session_unset è stato utilizzato per annullare l'impostazione delle variabili globali registrate come variabili di sessione come era comune in PHP 4. L'uso di quella funzione a oggi è anacronistico e non necessario. L'unico motivo per cui è ancora in PHP è probabilmente la compatibilità con le versioni precedenti e nient'altro. Se scrivi un nuovo codice, non dovresti usarlo. Se lo trovi all'interno del codice, dovresti rimuoverlo insieme alle chiamate a session_register () e al resto delle funzioni di gestione delle variabili di sessione PHP 4 a meno che tu non abbia a che fare esplicitamente con codice PHP 4.
hakre

5
Tuttavia è fonte di confusione: per favore descrivi local $_SESSION variable instance vs session data in the session storage. Come so, ci sono 1000 persone come me che non hanno capito il tuo punto. Grazie
Pratik

1
La tua risposta è troppo confusa. Per favore considera la possibilità di modificarlo, perché penso ancora che entrambi stiano distruggendo la sessione
Pratik

17

session_destroy(); sta eliminando l'intera sessione.

session_unset();cancella solo le variabili dalla sessione - la sessione esiste ancora. Solo i dati vengono troncati.


15
session_unset();

Cancella tutti i dati di tutte le variabili di sessione.


session_destroy();

Rimuovi tutte le sessioni.


Esempio :

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

$_SESSION[a]è NULL.


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

$_SESSION[a]è 1234.


Quindi, userò:

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

2
nel tuo esempio centrale -> session_unset();NON stai facendo nulla perché puoi ancora usare la sessione $_SESSION["a"] , quindi a cosa serve?
Pratik

1
$_SESSION[a]dovrebbe essere $_SESSION['a'] e, a differenza di quello che hai detto, questo NON è NULL nel tuo primo esempio
Istiaque Ahmed,

5

session_unset()cancellerà la $_SESSIONvariabile (come in array()), ma non toccherà il file di sessione. Ma quando lo script finisce; lo stato di $_SESSIONverrà scritto nel file. Quindi cancellerà il file ma non lo cancellerà. Quando lo usi session_destroy()non toccherà $_SESSION(Usa var_dump($_SESSION)dopo session_destroy()), ma eliminerà il file di sessione, quindi quando lo script esce non ci sarà un file per scrivere lo stato del file $_SESSION.


0

session_destroy()cancellerà la sessione dopo aver spostato la pagina e session_unset()cancellerà la sessione quando il codice viene eseguito.


0

Ho provato a usare session_unset($_SESSION['session_name'])pensando che annullerà solo il nome della sessione specifica o individuale / singola. Ma l'utilizzo session_unset($_SESSION['session_name'])annullerà solo il nome di tutte le sessioni. Il codice corretto da utilizzare è solo unset($_SESSION['session_name'])se si desidera annullare l'impostazione di un singolo nome di sessione.


0

session_start (); # creerà un array virtuale (associativo) nella memoria in tempo reale del browser

due elementi aggiunti

> $_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()

testare il blocco 1, 2 o 3 individualmente commentando gli altri


-2

Penso che session_destroy () e session_unset () dovrebbero essere usati contemporaneamente per assicurarsi che i dati della sessione siano sicuramente cancellati.


Penso che significhi che non sei sicuro della risposta. Questo dovrebbe essere un commento, non una risposta.
Shaiful Islam

4
session_unset()dopo session_destroy()sarebbe inutile. Utilizzare session_unset()per cancellare tutte le chiavi e i valori dal superglobale $ _SESSION, o utilizzare session_destroy()per eliminare l'intera sessione; non usarli entrambi solo per "assicurarti", affidati alla funzione per fare il suo lavoro.
Redburn

@redburn session_destroy()non annulla la var superglobale sess fino all'uscita dalla pagina corrente.
Yousha Aleayoub
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.