php改写session到数据库

session改写mysql

在调用 session_start();的地方改用实例化本类即可new SessionDB();

 

 

 session_set_save_handler(
            array($this, 'userSessionBegin'),
            array($this, 'userSessionEnd'),
            array($this, 'userSessionRead'),
            array($this, 'userSessionWrite'),
            array($this, 'userSessionDelete'),
            array($this, 'userSessionGC')
        );如果是类里要这样写,因为要明确是哪个类的方法如果在类外可以这样写

session_set_save_handler(
'userSessionBegin',
'userSessionEnd',
'userSessionRead',
'userSessionWrite',
'userSessionDelete',
'userSessionGC')

<?php

/**
 * session入库工具类
 */
class SessionDB {
    private $_dao;

    public function __construct() {
        //设置session处理器
        ini_set('session.save_handler', 'user');
        session_set_save_handler(
            array($this, 'userSessionBegin'),
            array($this, 'userSessionEnd'),
            array($this, 'userSessionRead'),
            array($this, 'userSessionWrite'),
            array($this, 'userSessionDelete'),
            array($this, 'userSessionGC')
        );

        //开启
        session_start();
    }

    function userSessionBegin() {
        //初始化DAO
        $config = array('host' => '127.0.0.1',    'port' => '3306', 'username'=>'shop34', 'password' => '1234abcd', 'charset'=>'utf8', 'dbname'=>'shop34');
        $this->_dao = MySQLDB::getInstance($config);
    }
    function userSessionEnd() {
        return true;
    }
    /**
     * 读操作
     * 执行时机:    session机制开启程中执行
     * 工作:        从当前session数据区读取内容
     * @param $sess_id string
     * @return string
     */
    function userSessionRead($sess_id) {
        //查询
        $sql = "SELECT session_content FROM `p34_session` WHERE session_id='$sess_id'";
        return (string) $this->_dao->getOne($sql);
    }
    /**
     * 写操作
     * 执行时机:    脚本周期结束时,PHP在整理收尾时
     * 工作:        将当前脚本处理好的session数据,持久化存储到数据库中!
     * @param $sess_id string
     * @param $sess_content string 序列化好的session内容字符串
     * @return bool
     */
    function userSessionWrite($sess_id, $sess_content) {
        // 完成写
        $sql = "REPLACE INTO `p34_session` VALUES ('$sess_id', '$sess_content', unix_timestamp())";
        return $this->_dao->query($sql);
    }
    /**
     * 删除操作
     * 执行时机:    调用了session_destroy()销毁session过程中被调用
     * 工作:        删除当前session的数据区(记录)
     * @param $sess_id string
     * @return bool
     */
    function userSessionDelete($sess_id) {
        //删除
        $sql = "DELETE FROM `p34_session` WHERE session_id='$sess_id'";
        return $this->_dao->query($sql);
    }
    /**
     * 垃圾回收操作
     * 执行时机:    开启session机制时,有概率的执行
     * 工作:        删除那些过期的session数据区
     * @param $max_lifetime
     * @return bool
     */
    function userSessionGC($max_lifetime) {
        //删除
        $sql = "DELETE FROM `p34_session` WHERE last_time<unix_timestamp()-$max_lifetime";
        return $this->_dao->query($sql);
    }

}

 

gc回收器调用次数改写

ini_set('session.gc_probability', '1'); 
ini_set('session.gc_divisor', '3');
//session.gc_divisor 与 session.gc_probability 合起来定义了在每个会话初始化时启动 gc(garbage collection 垃圾回收)进程的概率。此概率用 gc_probability/gc_divisor 计算得来。例如 1/100 意味着在每个请求中有 1% 的概率启动 gc 进程。session.gc_divisor 默认为 100。

 

posted @ 2015-12-22 20:19  自由无风  阅读(478)  评论(0编辑  收藏  举报