Php 在不写入或销毁会话的情况下关闭会话

Php 在不写入或销毁会话的情况下关闭会话,php,session,Php,Session,有没有一种方法可以在不编写或销毁PHP会话的情况下关闭它?我是缺少了什么,还是只有两个函数(session\u write\u close()和session\u destroy())将session\u status()重置为PHP\u session\u NONE?换句话说,如果我有一个打开的会话,我可以简单地关闭它而不影响外部会话数据,这样它就可以重新加载。您可以通过$\u session=null来完成此操作。会话不可用,但数据仍保留(不会被删除) 假设您在会话中有数据: <?ph

有没有一种方法可以在不编写或销毁PHP会话的情况下关闭它?我是缺少了什么,还是只有两个函数(
session\u write\u close()
session\u destroy()
)将
session\u status()重置为
PHP\u session\u NONE
?换句话说,如果我有一个打开的会话,我可以简单地关闭它而不影响外部会话数据,这样它就可以重新加载。

您可以通过
$\u 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 fpm 5.4.29,最新的nginx,memcached为会话处理程序

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

或者,您可以使用属性
$this->active=true;//或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');
        }
    }
}

几个月后,在提出了一个新的方法之后,这两个新方法现在可以在PHP5.6中使用,但是文档只提供了5.6.2

  • 会话\u abort()
    –放弃会话数组更改并完成会话,请参阅
  • session\u reset()
    –使用原始值重新初始化会话数组,请参阅

没有必要这样做。如果您不想“启用”会话,请不要使用它。谢谢逻辑思维骑士。如果我一开始不想使用它,我几乎还没到询问它的阶段。谢谢你的关注。第一部分并非真正的解决方案–会话状态保持活动状态。第二个解决方案是我目前拥有的,但它有点意味着重新发明轮子。对于一个测试套件,我需要在运行一个独立的php命令后重新加载当前会话数据,该命令通常会对其进行修改。有一些变通方法,但它们都很粗糙,当与本机会话函数一起使用时,通常会导致不希望的结果。@IanBytchek好的,我现在理解你的情况了。不幸的是,我没有想到更好的解决办法。祝您好运:)感谢您的输入:)请更新您关于为什么要重置会话的问题。当您打开一个PHP会话时,会创建一个锁,因此所有基于会话的PHP脚本都必须同步执行,从而抵消了异步调用的好处。您可以在似乎挂起的网站中看到这一点,每个页面元素都通过一个php脚本提供服务,该脚本由于会话访问而序列化。最佳实践是只在需要时启动会话,并尽快关闭对该会话的访问,以避免web请求排队。
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');
        }
    }
}