Session保存到数据库的php类分享

复制代码 代码如下:

  <?php

  class SessionToDB

  {

  private $_path = null;

  private $_name = null;

  private $_pdo = null;

  private $_ip = null;

  private $_maxLifeTime = 0;

  public function __construct(PDO $pdo)

  {

  session_set_save_handler(

  array(&$this, 'open'),

  array(&$this, 'close'),

  array(&$this, 'read'),

  array(&$this, 'write'),

  array(&$this, 'destroy'),

  array(&$this, 'gc')

  );

  $this->_pdo = $pdo;

  $this->_ip = !empty($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : null;

  $this->_maxLifeTime = ini_get('session.gc_maxlifetime');

  }

  public function open($path,$name)

  {

  return true;

  }

  public function close()

  {

  return true;

  }

  public function read($id)

  {

  $sql = 'SELECT * FROM session where PHPSESSID = ?';

  $stmt = $this->_pdo->prepare($sql);

  $stmt->execute(array($id));

  if (!$result = $stmt->fetch(PDO::FETCH_ASSOC)) {

  return null;

  } elseif ($this->_ip != $result['client_ip']) {

  return null;

  } elseif ($result['update_time']+$this->_maxLifeTime < time()){

  $this->destroy($id);

  return null;

  } else {

  return $result['data'];

  }

  }

  public function write($id,$data)

  {

  $sql = 'SELECT * FROM session where PHPSESSID = ?';

  $stmt = $this->_pdo->prepare($sql);

  $stmt->execute(array($id));

  if ($result = $stmt->fetch(PDO::FETCH_ASSOC)) {

  if ($result['data'] != $data) {

  $sql = 'UPDATE session SET update_time =? , date = ? WHERE PHPSESSID = ?';

  $stmt = $this->_pdo->prepare($sql);

  $stmt->execute(array(time(), $data, $id));

  }

  } else {

  if (!empty($data)) {

  $sql = 'INSERT INTO session (PHPSESSID, update_time, client_ip, data) VALUES (?,?,?,?)';

  $stmt = $this->_pdo->prepare($sql);

  $stmt->execute(array($id, time(), $this->_ip, $data));

  }

  }

  return true;

  }

  public function destroy($id)

  {

  $sql = 'DELETE FROM session WHERE PHPSESSID = ?';

  $stmt = $this->_pdo->prepare($sql);

  $stmt->execute(array($id));

  return true;

  }

  public function gc($maxLifeTime)

  {

  $sql = 'DELETE FROM session WHERE update_time < ?';

  $stmt = $this->_pdo->prepare($sql);

  $stmt->execute(array(time() - $maxLifeTime));

  return true;

  }

  }

  try{

  $pdo = new PDO('mysql:host=localhost;dbname=rphp4zf', 'root','rickyfeng');

  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  new SessionToDB($pdo);

  } catch(PDOException $e) {

  echo 'Error: '.$e->getMessage();

  }