В чем разница между 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 () теперь устарел? Я проверил это, и у меня это не сработало.
Navneet

@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 таких людей, как я, которые не поняли вашей точки зрения. Спасибо
Pratik

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

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"] , так что от него польза?
Pratik

1
$_SESSION[a]должно быть $_SESSION['a'] и в отличие от того, что вы сказали, это НЕ NULL в вашем первом примере
Istiaque Ahmed

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 (); # он создаст виртуальный массив (ассоциативный) в памяти браузера в реальном времени

добавлено два предмета

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

тестовый блок 1, 2 или 3 по отдельности, закомментировав другие


-2

Я думаю, что session_destroy () и session_unset () следует использовать одновременно, чтобы убедиться, что данные сеанса обязательно удалены.


Я думаю, это означает, что вы не уверены в ответе. Это должен быть комментарий, а не ответ.
Шайфуль Ислам

4
session_unset()после session_destroy()было бы бессмысленно. Используйте session_unset()для удаления всех ключей и значений из суперглобального $ _SESSION или используйте session_destroy()для удаления всего сеанса; не используйте и то, и другое только для того, чтобы «убедиться», доверьте функцию делать свою работу.
Redburn

@redburn session_destroy()не сбрасывает суперглобальную переменную сессию до выхода с текущей страницы.
Юша Алеайуб
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.