• 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。
  • 相关阅读:
    java面试之String源码中equals具体实现
    JVM虚拟机—JVM的垃圾回收机制(转载)
    Mysql学习笔记—视图
    Mysql学习笔记—索引
    JVM虚拟机—JVM内存
    设计模式—装饰器模式
    设计模式—代理模式
    设计模式—适配器模式
    设计模式—观察者模式
    设计模式—建造者模式
  • 原文地址:https://www.cnblogs.com/zywf/p/5067992.html
Copyright © 2020-2023  润新知