出于某种原因,我必须使用默认的保存处理程序初始化会话。
以前的代码使用session_set_save_handler()显式设置自定义处理程序。
在我的情况下,更改以前的代码不是一个现实的选项,所以是否有人知道如何将处理程序恢复为默认值,例如是否有session_restore_save_handler或session_unset_save_handler函数或等价物?
答案 0 :(得分:3)
从PHP 5.4开始,您可以通过直接实例化SessionHandler类来恢复默认会话处理程序:
session_set_save_handler(new SessionHandler(), true);
答案 1 :(得分:1)
在这里,我必须回答我自己的问题,因为没有人说什么:
首先,PHP没有提供session_restore_save_handler
或session_unset_save_handler
,并且(到目前为止)没有像以前那样恢复原状的本地方式。出于某种原因,PHP团队没有给我们选择以这种方式处理会话处理程序。
其次,可以使用以下代码模拟本机会话机制
class FileSessionHandler
{
private $savePath;
function open($savePath, $sessionName)
{
$this->savePath = $savePath;
if (!is_dir($this->savePath)) {
mkdir($this->savePath, 0777);
}
return true;
}
function close()
{
return true;
}
function read($id)
{
return (string)@file_get_contents("$this->savePath/sess_$id");
}
function write($id, $data)
{
return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
}
function destroy($id)
{
$file = "$this->savePath/sess_$id";
if (file_exists($file)) {
unlink($file);
}
return true;
}
function gc($maxlifetime)
{
foreach (glob("$this->savePath/sess_*") as $file) {
if (filemtime($file) + $maxlifetime < time() && file_exists($file)) {
unlink($file);
}
}
return true;
}
}
$handler = new FileSessionHandler();
session_set_save_handler(
array($handler, 'open'),
array($handler, 'close'),
array($handler, 'read'),
array($handler, 'write'),
array($handler, 'destroy'),
array($handler, 'gc')
);
register_shutdown_function('session_write_close');
这个逻辑最接近PHP的本地会话处理一个,但当然,在不同情况下会有不可预测的行为。我现在能够得出的结论是基本的会话操作完全被它覆盖了。