В чем разница между 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;
SLyHuy
источник
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_destroy()удалит сеанс после перемещения страницы и session_unset()удалит сеанс при запуске кода.

Радиан Юсуф Махендра
источник
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()не сбрасывает суперглобальную переменную сессию до выхода с текущей страницы.
Юша Алеайуб