将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; 
+0

到底会发生什么?什么是错误? –

+1

您的代码中不存在$ user变量。 –

+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");

+0

哦,所以$ sessionId有来自用户浏览器和我的数据库的会话的ID?和其他所有$ _ SESSION ['SOMETHING']的数据? –

+0

是的,这个表应该有唯一的会话ID,到期时间和所有'$ _SESSION'序列化的值。 –

+0

谢谢!我想现在我明白了这个过程 –

中的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?欲了解更多信息

+0

非常感谢!我的问题是在$数据,知道我明白它具有所有会话值! –