将php会话保存到db(session_set_save_handler)

时间:2015-04-17 14:33:52

标签: php session

我在网站上工作,我们需要群集服务器,以便有超过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;

2 个答案:

答案 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");