将php会话保存到db(session_set_save_handler)
我在一个网站上工作,我们需要集群服务器有超过1台计算机处理流量。 所以我需要将php会话(文件会话)转换为此群集工作的数据库。将php会话保存到db(session_set_save_handler)
我有一个简单的登录文件: 检查后用户==密码,如果NUM行== 1:
$_SESSION['user']=$_POST['user'];
我的问题就在这里开始,我怎么能写这样的用户在我的数据库使用的session_set_save_handler ? 我需要更改get _write的工作吗?
public function _write($id){
// Create time stamp
$data = time();
// Set query
$this->db->query('INSERT INTO sessions (id,user,data) VALUES (:id, :user, :data)');
// Bind data
$this->db->bind(':id', $id);
$this->db->bind(':user', $user); //how can i get login user?
$this->db->bind(':data', $data);
// Attempt Execution
// If successful
if($this->db->execute()){
// Return True
return true;
}
// Return False
return false;
}
DB
CREATE TABLE IF NOT EXISTS `sessions` (
`id` varchar(32) NOT NULL,
`user` varchar(20),
`data` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
首先,你_write
功能错过第二个参数,在这种情况下,$user
:
function _write($id,$user)
这就是你的数据($_SESSION
阵列的内容)的位置。名称$user
令人困惑,它只是包含在$_SESSION
数组中的任何数据,所以最好使用例如$value
的名称。
另外,因为会话表中的id应该是唯一的,如果已经存在这样的会话,它可能不会成功。因此,在这种情况下,你用过期时间更新:
if($this->db->execute()){
return true;
}else{
$this->db->query('UPDATE sessions SET user=:user, data:data WHERE id=$id');
$this->db->bind(':access', $access);
$this->db->bind(':data', $data);
$this->db->execute();
}
至于时间,应该是到期时间,你最好将其更改为:
$data = time()+ini_get("session.gc_maxlifetime");
哦,所以$ sessionId有来自用户浏览器和我的数据库的会话的ID?和其他所有$ _ SESSION ['SOMETHING']的数据? –
是的,这个表应该有唯一的会话ID,到期时间和所有'$ _SESSION'序列化的值。 –
谢谢!我想现在我明白了这个过程 –
中的session_set_save_handler的写入功能,接受两个参数:
function write(string $sessionId, string $data)
{
//$data = serialized presentation of your whole session, including 'user'
...
}
见What kind of serialization uses PHP function session_set_save_handler's write function?欲了解更多信息
非常感谢!我的问题是在$数据,知道我明白它具有所有会话值! –
到底会发生什么?什么是错误? –
您的代码中不存在$ user变量。 –
我不能获得登录用户保存在我的会话数据库,我不知道如何发送此登录用户名到我的功能 –