71、通过MYSQL数据库操作Session会话完整源码类

阅读() @2018-10-29 18:16:07

PHP中的session,不仅可以通过文件和cookie来操作,当网站访问量过大的时候,用数据库来存储session信息是最高效的,下面是我的测试代码,仅供参考!

<?php
    class Session{
        //session有效时长
        static public $maxtime;
        //指定session数据表
        static public $table;
        //初始化
        static function run($maxtime, $table){
            if(ini_get('session.save_handler')=='user' || ini_set('session.save_handler', 'user')){
                session_set_save_handler(
                    array(__CLASS__, 'start'),
                    array(__CLASS__, 'close'),
                    array(__CLASS__, 'read'),
                    array(__CLASS__, 'write'),
                    array(__CLASS__, 'destroy'),
                    array(__CLASS__, 'gc')
                );
            }
            self::$maxtime = $maxtime ? $maxtime : 1000;
            self::$table = $table ? $table : 'photos_session'; 
            //开启session会话控制
            session_start();
        }
        //开
        static function start($path, $session_name){
            return true;
        }
        //关
        static function close(){
            self::gc();
            session_unset();
            session_destroy();
            return true;
        }
        //读
        static function read($sid){
            $sql = 'select * from '.self::$table.' where session_id='."'$sid'";
            $sessionObj = Db::$db->query($sql);
            $sessionArry = $sessionObj->fetchAll(PDO::FETCH_ASSOC);
            return count($sessionArry)>0 ? $sessionArry[0]['data'] : 0;  
        }
        //写
        static function write($sid, $data){
            //获取当前seesion_id();
            $sid = session_id();
            //获取当前时间
            $nowtime = time();
            //判断当前用户session是否已经存在
            $sql = 'select * from '.self::$table.' where session_id="'.$sid.'"';
            $sessionObj = Db::$db->query($sql);
            $sessionArry = $sessionObj->fetchAll(PDO::FETCH_ASSOC);
            //如果已经存在就update,如果不存在就insert
            if(count($sessionArry)>0){
                $sql = 'update '.self::$table.' set data='."'$data'".', nowtime='."'$nowtime'".' where session_id='."'$sid'";
                Db::$db->query($sql);
            }else{
                $sql = 'insert into '.self::$table.' set data='."'$data'".', session_id='."'$sid'".', nowtime='."'$nowtime'";
                Db::$db->query($sql);
            }
        }
        //卸
        static function destroy($sid){
            $sql = 'delete from '.self::$table.' where session_id='."'$sid'";
            Db::$db->query($sql);
        }
        //垃
        static function gc(){
            $nowtime = time();
            $sql = 'delete from '.self::$table.' where time<'.($nowtime-self::$maxtime);
            Db::$db->query($sql);
        }
    }

熟悉面向对象的模式,采用PDO连接数据库。

以上源码用到了数据连接,是我自己封装的一个类,源码查看《PHP封装MYSQL数据库操作类源码》。将源码复制粘贴到一个php文件中,直接调用即可使用!

微信二维码
锐壳主机