【问题标题】:What is the difference between session_unset() and session_destroy() in PHP?PHP 中的 session_unset() 和 session_destroy() 有什么区别?
【发布时间】:2011-05-17 05:48:14
【问题描述】:

来自php.net 文档:

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

session_unset — 释放所有会话变量

我的三部分问题是:

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

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

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

【问题讨论】:

    标签: php session session-cookies


    【解决方案1】:

    session_destroy(); 正在删除整个会话。

    session_unset(); 仅从会话中删除变量 - 会话仍然存在。只有数据被截断。

    【讨论】:

    • 所以和SQL查询中的DROP和TRUNCATE表的区别基本一样吧?
    【解决方案2】:

    session_unset 只是清除 $_SESSION 变量。相当于做:

    $_SESSION = array();
    

    所以这只会影响本地 $_SESSION 变量实例,而不影响会话存储中的会话数据。

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

    其他一切都保持不变。

    【讨论】:

    • @Gumbo 现在不推荐使用 session_unset() 不是有问题吗?我检查了这个,它对我不起作用。
    • @hakre 警告是什么?
    • @GoTo:该 session_unset 用于取消设置注册为会话变量的全局变量,这在 PHP 4 中很常见。从今天开始使用该函数是不合时宜的,没有必要。它仍然存在于 PHP 中的唯一原因可能是向后兼容性,仅此而已。如果您编写新代码,则不应使用它。如果您在代码中找到它,则应将其与对 session_register() 的调用以及 PHP 4 会话变量处理函数的其余部分一起删除,除非您明确处理 PHP 4 代码。
    • 仍然令人困惑:请描述local $_SESSION variable instance vs session data in the session storage。据我所知,像我这样的人有 1000 人不明白你的意思。谢谢
    • 你的回答太混乱了。请考虑编辑它,因为我仍然认为两者都在破坏会话
    【解决方案3】:
    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;
    

    【讨论】:

    • 在你的中间例子中 -> session_unset(); 你什么也没做,因为你仍然可以使用 $_SESSION["a"] 的会话,那么它有什么用呢?
    • $_SESSION[a] 应该是 $_SESSION['a'] 和你所说的不同,这在你的第一个例子中不是 NULL
    【解决方案4】:

    session_unset() 将清除$_SESSION 变量(如array()),但不会触及会话文件。但是当脚本结束时; $_SESSION 的状态将被写入文件。然后它将清除文件但不会删除它。当您使用session_destroy() 时,它不会触及$_SESSION(在session_destroy() 之后使用var_dump($_SESSION)),但会删除会话文件,因此当脚本退出时不会有文件来写入@ 的状态987654329@.

    【讨论】:

      【解决方案5】:

      我认为 session_destroy() 和 session_unset() 应该同时使用,以确保会话数据确实被删除。

      【讨论】:

      • 我认为您不确定答案。这应该是评论而不是答案。
      • session_unset()session_destroy() 之后将毫无意义。使用session_unset() 清除$_SESSION 超全局中的所有键和值,或者使用session_destroy() 删除整个会话;不要仅仅为了“确保”而使用两者,相信函数可以完成它的工作。
      • @redburn session_destroy() 在退出当前页面之前不会取消设置 sess 超全局变量。
      【解决方案6】:

      session_destroy() 将在移动页面后删除会话 和 session_unset() 将在代码运行时删除会话。

      【讨论】:

        【解决方案7】:

        我尝试使用session_unset($_SESSION['session_name']) 认为它只会取消设置特定或个人/单个会话名称。但是使用session_unset($_SESSION['session_name']) 只会取消设置所有会话名称。如果您想取消设置单个会话名称,则只能使用 unset($_SESSION['session_name']) 正确的代码。

        【讨论】:

          【解决方案8】:

          session_start(); #它将在浏览器实时内存中创建一个虚拟数组(关联)

          添加了两个项目

          > $_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 分别注释掉其他人

          【讨论】:

            猜你喜欢
            • 2015-06-23
            • 2015-12-06
            • 2018-08-19
            • 2018-11-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-10
            • 2018-11-18
            相关资源
            最近更新 更多