为什么session_unset()在session_destroy()之后没有任何效果?

时间:2018-06-06 10:34:24

标签: php session unset

通过阅读session_unset()session_destroy(),我发现destroy无法清除变量等等。

  1. 为什么下面的代码没有清理$_SESSION超级全局,它应该通过它的文档?

  2. 此行为是否记录在何处?

  3. 要重现的片段:

    #!/usr/bin/php
    <?php
    
    session_start();
    
    $_SESSION['x'] = 1;
    
    // If you uncomment this, `session_unset` works as intended.
    session_destroy();
    
    // It doesn't matter if you call unset, it won't have any effect
    // as session_destroy was called.
    session_unset();
    
    fwrite(STDERR, var_export($_SESSION, true));
    // prints: array ('x' => 1), even though session_unset was called
    

2 个答案:

答案 0 :(得分:0)

因为session_destroy()将删除与该用户相关的所有会话。 here document

答案 1 :(得分:0)

我认为这种行为与默认会话驱动程序的实现有关。 (见here)。

当调用session_destroy时,PHP触发会话类处理程序的destroy方法。也许它只破坏数据而不触及$_SESSION,当调用session_unset时,它会验证每个$_SESSION项目,如果项目的密钥是持久的,它会删除它,如果没有,它会删除它什么都没有。

最后,当您首先致电session_destroy时,所有数据都会被销毁,因此session_unset$_SESSION[$key]未被保留的情况下无法执行任何操作。

<?php
foreach($_SESSION as $key=>$value)
{
   global $data_persisted; //fictive variable containing persisted datas as array
   if(isset($data_persisted[$key])
   {
      unset($_SESSION[$key]);
   }
}

最后,在session_destroysession_unset各自通话后,$_SESSION仍然会有自己的数据。