PHP中的session_unset()和session_destroy()有什么区别?


88

php.net文档中:

session_destroy —销毁注册到会话的所有数据

session_unset —释放所有会话变量

我的三部分问题是:

这两个功能看起来非常相似。
两者之间的真正区别是什么?

两者似乎都删除了注册到会话的所有变量。它们中的任何一个是否实际上破坏了会话本身?如果不是,您如何完成此任务(销毁会话本身)。

这两个函数都没有删除客户端的会话cookie是否正确?

Answers:


144

session_unset只是清除$_SESSION变量。等效于:

$_SESSION = array();

因此,这只会影响局部$_SESSION变量实例,而不会影响会话存储中的会话数据。

与此相反,session_destroy销毁存储在会话存储器中的会话数据(例如文件系统中的会话文件)。

其他所有内容保持不变。


@Gumbo现在弃用session_unset()是否有问题?我检查了一下,但它对我不起作用。
Navneet 2012年

@hakre警告是什么?
GoTo

4
@GoTo:session_unset用于取消设置为会话变量的全局变量,这在PHP 4中很常见。到目前为止,该函数的使用是过时的,而且没有必要。它仍然存在于PHP中的唯一原因可能是向后兼容,仅此而已。如果编写新代码,则不应使用它。如果在代码中找到它,则应将其与对session_register()的调用以及其他PHP 4会话变量处理函数一起删除,除非您明确地处理PHP 4代码。
hakre 2013年

5
仍然令人困惑:请描述local $_SESSION variable instance vs session data in the session storage。据我所知,有1000个像我这样的人没有明白你的意思。谢谢
Pratik 2015年

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 of $_SESSION["a"] ,那么它的用途是什么?
Pratik

1
$_SESSION[a]应该是$_SESSION['a'] 并且与您在第一个示例中所说的不为空的方式不同
Istiaque Ahmed

5

session_unset()将清除$_SESSION变量(如中的array()),但不会触摸会话文件。但是当脚本结束时;的状态$_SESSION将被写入文件。然后它将清除文件,但不会删除它。当您使用session_destroy()它时,不会触摸$_SESSIONvar_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()来确保确实删除了会话数据。


我认为这意味着您不确定答案,这应该是评论而不是答案。
Shaiful伊斯兰教

4
session_unset()之后session_destroy()将毫无意义。使用session_unset()以清除$ _SESSION超全局,或使用的所有键和值session_destroy()删除整个会话; 不要仅仅为了“确定”而使用这两者,而是要信任函数来完成其工作。
redburn

@redburnsession_destroy()在退出当前页面之前不会取消设置sess超全局变量。
Yousha Aleayoub '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.