关闭会话而不写入或销毁它

时间:2014-06-10 08:52:22

标签: php session

有没有办法在没有编写或销毁它的情况下关闭PHP会话?我错过了什么,或只有两个函数(session_write_close()session_destroy())将session_status()重置为PHP_SESSION_NONE?换句话说,如果我有一个开放会话,我可以简单地关闭它而不影响外部会话数据,因此可以重新加载它。

2 个答案:

答案 0 :(得分:3)

您可以$_SESSION = null执行此操作。会话不可用,但数据仍然存在(不会被删除)。

考虑到会话中有数据:

<?php
session_start();
session_regenerate_id(); // get a fresh id
echo session_id();

$_SESSION['test'] = '12345';

print_r($_SESSION); // echoes the data in the session

数据:test|s:5:"12345";

然后在下一个请求中:

<?php
session_start();
echo session_id() . "<br>"; //  echoes the same id as of the last request

$_SESSION = null;

print_r($_SESSION); // echoes nothing

echo "<br>";

echo session_status(); // echoes 2 (PHP_SESSION_ACTIVE)

数据仍然相同:test|s:5:"12345";

php-fpm 5.4.29, most recent nginx, memcached as session handler)。

数据仍然可以通过$_SESSION['whatever'] = ...写入但不能读取。我不确定这是否是一个很好的解决方案,但我不得不承认我仍然不明白为什么或者你需要什么。

作为替代方案,您可以使用属性$this->active = true; // or false为会话实现包装类:

class MySessionWrapper {
    protected $active;
    protected $data;
    // getter setter for $this->active and $this->data ...

    public function getData($var) {
        if ($this->active !== true) {
            throw new Exception('session disabled');
        }
    }
}

答案 1 :(得分:2)

在提出issue几个月之后,PHP 5.6中现在提供了两种新方法,但文档仅以5.6.2到达。

  • session_abort() - 放弃会话数组更改并完成会话,请参阅docs
  • session_reset() - 使用原始值重新初始化会话数组,请参阅docs