我在网站上工作,我们需要群集服务器,以便有超过1台计算机处理流量。 所以我需要将php会话(文件会话)转换为数据库以进行此集群工作。
我有一个简单的登录文件: 检查发布用户==密码,如果num rows == 1:
$_SESSION['user']=$_POST['user'];
我的问题从这里开始,如何使用session_set_save_handler在我的数据库中编写此USER? 我需要改变什么让_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;
答案 0 :(得分:0)
session_set_save_handler的write函数接受两个参数:
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?了解详情
答案 1 :(得分:0)
首先,您的_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");