PHP 中 unset($_SESSION[])、session_unset() 和 session_destroy() 的区别

Posted

技术标签:

【中文标题】PHP 中 unset($_SESSION[])、session_unset() 和 session_destroy() 的区别【英文标题】:Difference between unset($_SESSION[]), session_unset() and session_destroy() in PHP 【发布时间】:2015-06-23 19:41:12 【问题描述】:

我需要关于 php 会话的帮助

我试过这段代码

<?php 
session_start();
$_SESSION['one'] = "Hello";
$_SESSION['two'] = "World";
$_SESSION['three'] = "Welcome to session";
var_dump($_SESSION);

打印出来

array (size=3)
  'one' => string 'Hello' (length=5)
  'two' => string 'World' (length=5)
  'three' => string 'Welcome to session' (length=18)

然后我取消设置会话一

unset($_SESSION['one']);
echo "Session one unset and only session two and three exist";
var_dump($_SESSION);

它会打印出来

Session one unset and only session two and three exist
array (size=2)
  'two' => string 'World' (length=5)
  'three' => string 'Welcome to session' (length=18)

如果我销毁会话

session_destroy();
echo "Session Destroyed <br />";
var_dump($_SESSION);

但是什么也没发生,我仍然可以将会话打印为

Session Destroyed 
array (size=2)
  'two' => string 'World' (length=5)
  'three' => string 'Welcome to session' (length=18)

但如果我再次使用session_destroy();,它会给我一个警告

警告:session_destroy(): 试图销毁未初始化的会话

如果我使用 unset 而不是 session_destroy() 代码

session_unset('two');
echo "Session two unset";
var_dump($_SESSION);

所有会话变量都未设置,我无法访问会话三个变量 它打印

Session two unset
array (size=0)
  empty

如果我使用session_unset(); 而不是使用session_unset('two');,那么我也会得到相同的结果。

那么unset($_SESSION['one'])session_unset('one')session_unset()session_destroy().之间的实际区别是什么

我用谷歌搜索了它,到处都得到了session_destroy() 用于销毁整个会话的答案(但在上面的代码中我仍然可以访问会话变量),session_unset('one') 用于仅取消设置单个会话变量(但在上面的代码中,如果我使用session_unset('one'),所有会话变量都会被取消设置。

所以请帮助我了解会话的工作原理,以及在记录我们的用户时应该使用什么代码,session_unset()session_destroy()

【问题讨论】:

格式化Q的标题,只用几句话就能准确理解问题! ***.com/help/how-to-ask Session unset, or session_destroy?的可能重复 【参考方案1】:

我猜是销毁了但是内存还没有释放,所以你还是可以看看的。而 unset 将其设置为 null。

【讨论】:

【参考方案2】:

使用session_destroy()后,会话cookie被删除,会话不再存储在服务器上。 $_SESSION 中的值可能仍然可用,但它们不会在下一页加载时出现。

根据PHP

void session_unset ( void )

session_unset() 函数释放当前注册的所有会话变量,并且不带任何参数。

unset($_SESSION['name']); 将只删除姓名数据。

【讨论】:

你是对的,在session_destroy() 之后,会话变量中的值在下一页加载时不再可用。但是unset($_SESSION[])session_unset()有什么区别 好的,这意味着我们应该只使用session_unset() 而不是 session_unset('one')。【参考方案3】:

其实很简单,

session_unset — 释放所有会话变量,但会话 id 不会被销毁

session_destroy — 销毁注册到会话的所有数据,调用此函数时应注册第一个会话。

unset($_SESSION['VARIABLE_NAME']) - 这将取消设置您传递的变量值。

在您的示例中,直接调用 session_destroy() 是不正确的,因此您可以看到会话中存在的变量值,您可以调用 session_destroy 注册会话。

谢谢 阿米特

【讨论】:

1.你能解释一下如何调用session_destroy() 2. 我们如何注册一个会话 3. session_unset()session_unset('VARIABLE_NAME') 是否具有相同的效果。因为在使用session_unset('VARIABLE_1') 后,我无法访问session_unset('VARIABLE_2') 4. 我应该在注销页面中使用哪个 1. session_destroy(),可以直接调用。 2. 可以调用 session_register() 函数注册一个会话。 3.没有 session_unset('VARIABLE_NAME') 将从会话中取消设置变量,并且 session_unset() 将从会话中删除所有变量。因此,在您的情况下,您应该使用 session_destroy,这将完全销毁所有会话变量和会话 ID,并将注销用户。

以上是关于PHP 中 unset($_SESSION[])、session_unset() 和 session_destroy() 的区别的主要内容,如果未能解决你的问题,请参考以下文章

php unset array from 2d session array

PHP学习笔记:删除与销毁session

为啥我们在做 LOGOUT.php 时同时需要 unset 和 session destroy? [复制]

PHP Unset 正在重置我的会话数组

PHP - 无法结束会话

PHP中session函数的问题