- 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();
- }
-
复制代码
|