У чому різниця між session_unset () та session_destroy () у PHP?


88

З документації php.net :

session_destroy - знищує всі дані, зареєстровані на сеанс

session_unset - звільнити всі змінні сеансу

Моє запитання з трьох частин:

Ці дві функції здаються дуже схожими.
Яка насправді різниця між ними?

Здається, обидва видаляють усі змінні, зареєстровані в сеансі. Хтось із них насправді знищує саму сесію? Якщо ні, то як це зробити (знищити сам сеанс).

Чи правильно, що жодна з двох функцій не видаляє сеансовий файл cookie у клієнта?

Відповіді:


144

session_unsetпросто очищає $_SESSIONзмінну. Це еквівалентно виконанню:

$_SESSION = array();

Отже, це впливає лише на $_SESSIONекземпляр локальної змінної, але не на дані сеансу в сховищі сеансів.

На відміну від цього, session_destroyзнищує дані сеансу, які зберігаються у сховищі сеансу (наприклад, файл сеансу у файловій системі).

Все інше залишається незмінним.


@Gumbo Хіба зараз не виникає проблем із застаріванням session_unset ()? Я перевірив це, і у мене це не спрацювало.
Навнеєт

@hakre про що попереджає?
GoTo

4
@GoTo: Цей session_unset був використаний для скасування глобальних змінних, зареєстрованих як змінні сеансів, як це було поширено в PHP 4. Використання цієї функції на сьогоднішній день є анахронічним і необов’язковим. Єдина причина, по якій він все ще є в PHP, - це, мабуть, зворотна сумісність і ніщо інше. Якщо ви пишете новий код, вам не слід його використовувати. Якщо ви знайдете його в коді, вам слід видалити його разом із викликами session_register () та рештою функцій обробки змінних сеансу PHP 4, якщо ви явно не маєте справу з кодом PHP 4.
hakre

5
Проте це бентежить: опишіть, будь ласка local $_SESSION variable instance vs session data in the session storage. Як я знаю, є 1000 таких людей, як я, які не зрозуміли вашу думку. Дякую
Пратік

1
Ваша відповідь занадто заплутана. Будь ласка, подумайте про його редагування, тому що я все ще думаю, що обидва руйнують сесію
Пратік

17

session_destroy(); видаляє весь сеанс.

session_unset();видаляє лише змінні з сеансу - сеанс все ще існує. Усі дані усічені.


15
session_unset();

Просто очистіть усі дані всіх змінних сеансу.


session_destroy();

Видалити весь сеанс.


Приклад :

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

$_SESSION[a]є NULL.


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

$_SESSION[a]є 1234.


Отже, я буду використовувати:

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

2
у вашому середньому прикладі -> session_unset();ви НЕ робите нічого, оскільки все ще можете використовувати сеанс $_SESSION["a"] , так що для чого це?
Пратік

1
$_SESSION[a]повинно бути $_SESSION['a'] і на відміну від того, що ви сказали, це НЕ
ПУСТО

5

session_unset()очистить $_SESSIONзмінну (як у array()), але вона не торкнеться файлу сеансу. Але коли сценарій закінчується; стан $_SESSIONзаповіту буде записано до справи. Потім файл очистить, але не видалить. Коли ви використовуєте, session_destroy()він не торкнеться $_SESSION(Використовувати var_dump($_SESSION)після session_destroy()), але видалить файл сеансу, тому при виході сценарію не буде файлу для запису стану $_SESSION.



0

Я намагався використовувати, session_unset($_SESSION['session_name'])думаючи, що це призведе до скасування лише конкретного або окремого / окремого імені сесії. Але використання session_unset($_SESSION['session_name'])лише скасує всі назви сеансів. Правильний код для використання лише у тому випадку, unset($_SESSION['session_name'])якщо ви хочете скасувати одну назву сеансу.


0

session_start (); #it ​​створить віртуальний масив (асоціативний) у пам'яті браузера в режимі реального часу

додано два елементи

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

тест1

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

тест2

> 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

тест3

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

тестувати блок 1, 2 або 3 на індивідуально, коментуючи інші


-2

Думаю, session_destroy () та session_unset () слід використовувати одночасно, щоб переконатися, що дані сеансу напевно видалені.


Я думаю, ви знаєте, що ви не впевнені у відповіді. Це повинен бути коментар, а не відповідь.
Шайфул Іслам

4
session_unset()після session_destroy()було б безглуздо. Використовуйте session_unset()для очищення всіх ключів і значень із суперглобалу $ _SESSION або використовуйте session_destroy()для видалення всього сеансу; не використовуйте обидва лише для того, щоб "переконатися", довіртесь функції виконувати свою роботу.
redburn

@redburn session_destroy()не знімає sess superglobal var до виходу з поточної сторінки.
Yousha Aleayoub
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.