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