' session_destroy()'完全摧毁并使超级全局变量$ _SESSION无法访问?

时间:2017-08-13 19:19:22

标签: php session session-variables session-cookies superglobals

我已经了解到

session_unset()删除所有会话变量,这意味着它只是清除$_SESSION变量,它等同于:

$_SESSION = array();

这只会影响本地$_SESSION变量实例。

session_destroy()会破坏存储在会话存储中的会话数据。

我的问题如下:

  1. 会话是否意味着$ _SESSION超级全局变量?
  2. 当调用session_destroy()时,超级全局变量$_SESSION是否也会被破坏并变得无法访问?
  3. 如果超级全局变量$ _SESSION即使在调用session_destroy()之后也无法访问,那么当会话变量实例已被session_unset()销毁时它实际销毁了什么?
  4. 感谢。

2 个答案:

答案 0 :(得分:1)

session_unset()不会破坏会话,session_unset应该用在单个会话变量上。

session_unset($_SESSION['user_id']);

会话是指$ _SESSION超级全局变量吗?

根据php文档,不要在全局变量[http://php.net/manual/en/function.session-unset.php][1]

上使用session_unset
  

请勿使用unset($ _ SESSION)取消整个$ _SESSION   禁用通过$ _SESSION注册会话变量   超全局。

当调用session_destroy()时,超级全局变量$ _SESSION也会被破坏并变得无法访问吗?

不,它不会变得无法进入。在使用session_destroy()销毁会话后,您可以使用session_start()来创建新会话。

如果超级全局变量$ _SESSION即使在调用session_destroy()之后也不会变得无法访问,那么会话变量实例已经被session_unset()销毁时它实际上会破坏它吗?

调用session_unset应该用于删除单个会话变量,而不是销毁你的会话。使用session_unset后,会话仍处于活动状态,您可以从我的测试中看到:

<?php
    // This prints "Active"
    session_start();
    $_SESSION['user_id'] = 1000;
    session_unset($_SESSION['user_id']);
    if(session_status()==2)
        echo "Active \n";

要在php中销毁会话,我建议不要尝试使用session_unset。我这样做:

// hijack then destroy
$session_id = session_id();
session_id($session_id);
session_start();
session_destroy();
session_commit();

答案 1 :(得分:0)

启动会话时,会生成会话ID并将其另存为cookie。

session_destroy()将删除$_SESSION的数组,因此与session_unset()相同,但此外它还会破坏会话ID。该cookie将被清除。

从这一点开始,您只能在使用$_SESSION开始会话后再次访问session_start()变量。