簡體   English   中英

將php會話保存到數據庫(session_set_save_handler)

[英]save php session to db (session_set_save_handler)

我在一個網站上工作,我們需要對服務器進行群集,以使多台計算機處理流量。 因此,我需要將php會話(文件會話)轉換為db才能進行此群集工作。

我有一個簡單的登錄文件:檢查發布用戶==密碼,是否行數== 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;
}

D B

CREATE TABLE IF NOT EXISTS `sessions` (
  `id` varchar(32) NOT NULL,
  `user` varchar(20),
  `data` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

session_set_save_handler的write函數接受兩個參數:

function write(string $sessionId, string $data)
{
    //$data = serialized presentation of your whole session, including 'user'
    ...
}

請參閱哪種序列化使用PHP函數session_set_save_handler的write函數? 欲了解更多信息

首先,您的_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");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM