返回顶部

收藏

php将session保存到数据库类

更多

php默认情况下是把session保存在文件中的,如果要保存到数据库则需要自己实现类了。

需要注意的是session读取很很频繁,如果用mysql的建议用内存数据库。

[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();
}

标签:php,Session

收藏

0人收藏

支持

0

反对

0