Session保存到数据库的php类分享 |
本文标签:Session,数据库 复制代码 代码如下: <?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(); } |