• PHP 实现Session入库/存入redis


    对于大访问量的站点使用默认的Session 并不合适,我们可以将其存入数据库、或者使用Redis KEY-VALUE数据存储方案
    首先新建一个session表
    CREATE TABLE `sessions` (
      `sid` char(40) NOT NULL,
      `updatetime` int(20) NOT NULL,
      `data` varchar(200) NOT NULL,
      UNIQUE KEY `sid` (`sid`) USING HASH
    ) ENGINE=MEMORY DEFAULT CHARSET=utf8;

    Mysql 的memory引擎采用内存表,所有数据存储在内存,操作速度快

    <?php
    //引入数据库文件
    include "db.php";
    class MySessionHandler implements SessionHandlerInterface
    {
        private $savePath;
        private $sessData;
        public $expiretime;    //设置过期时间
        public $db;    //数据库
        public function __construct($hanlder =''){
             
            $this->db = Database::getInstance();   
             
            //获取数据库实力 
            ///var_dump($this->db);
             
        }
         
        public function open($savePath, $sessionName)
        {
     
            return true;
        }
     
        public function close()
        {
            return true;
        }
     
        public function read($id)
        {    
            $sql ="select * from sessions where sid ='$id'";
            $result = $this->db->execute($sql);
                if(!empty($result)){
                     return $this->sessData = $result;
                }
        }
                //函数的参数 $id -> 当前会话ID
                //数据DATA -> 序列化之后的字符串
        public function write($id, $data)
        {
            // echo $id;
            // echo $data;
            $now = time();
            $newExp = $now+$this->expiretime;    //总时间=当前时间 + 期限时间
            $sql = "select * from sessions where sid ='$id'";
            $result = $this->db->getOne($sql);
            //var_dump($result);
            if($data==''||isset($data)){
                $data = $this->sessData;
            }
                if($result){
                //如果存在则更新
       $sql ="update sessions set updatetime = '$newExp',data ='$data' where sid = '$id'";
                    //echo $sql;
                        $update_data =$this->db->execute($sql);
                        if($update_data){
                            return true;
                        }
                     
                }else{
                //不存在则生成生成
        $sql = "insert into sessions(sid,updatetime,data) values('$id','$now','$data')";
            $insert_data = $this->db->execute($sql);
            if($insert_data){
            return true;
                    }
                }
                return false;
        }
     
        public function destroy($id)
        {        //销毁
            $sql = "delete from sessions where sid="."$id";
            $destory = $this->db->execute($sql);
            if($destory){
                  return true;
            }else{
                return false;
            }
        }
     
        public function gc($sessMaxLifeTime)
        {
          $t = time();
        $sql ="delete from sessions where $t - 'updatetime'>${sessMaxLifeTime}";
            $data = $this->db->execute($this->tosql);
            if($data){
                return true;
            }else{
                return false;
                }
            return true;
        }
    }
    实例化
    此处 PHP 手册可以有两种方法
        1,实现了SessionHandlerInterface借口的对象,自PHP5.4可以使用
        2 ,直接使用  session_set_save_handler
    //判断PHP版本
     if(version_compare(PHP_VERSION,5.4)==1){
                  
         session_set_save_handler($handler, true);
        session_start();
        }else{   
            ini_set('session.use_trans_sid',0);
            ini_set('session.use_cookies',1);
            ini_set('session.cookie_path','/');
                ini_set('session.save_handler','user');
                session_module_name('user');
                session_set_save_handler(array($session,"open"),array($session,"close"),array($session,"read"),array($session,"write"),array($session,"destory"),array($session,"gc"));
                session_start();     
             }
    $_SESSION['QQ']="QQ";
    echo $_SESSION['QQ'];

    数据库代码 db.php

    <?php 
    class Database{
             static $instance;
            static $db;
        static  function getInstance(){      
            if(self::$instance){
                return self::$instance;
            }else{
                return new  Database();   
            }
        }
        public function __construct(){
            self::$db = new PDO('mysql:host=localhost;dbname=session', 'root','');
        }
     
            public  function getOne($sql){
                $rs =self::$db->query($sql);
                @$rs->setFetchMode(PDO::FETCH_ASSOC);//返回关联数组
                $result = $rs -> fetch();
                return $result;
            }
            public function execute($sql){
                 
                 
                    $rs = self::$db->exec($sql);
                    return $rs;
                     
            } 
         
     
    }
     
     
    //$data = Database::getInstance();
    //var_dump($data);

    使用REDIS 存储SESSION

    <?php
    class SessionManager{
        private $redis;
        private $sessionSavePath;
        private $sessionName;
        private $sessionExpireTime = 30;
        public function __construct(){
            $this->redis = new Redis();
            $this->redis->connect('127.0.0.1',6379);    //连接redis
            $retval = session_set_save_handler(
                array($this,"open"),
                array($this,"close"),
                array($this,"read"),
                array($this,"write"),
                array($this,"destory"),
                array($this,"gc")
            );
                session_start();
        }
         
            public function open($path,$name){
                return true;
            }
            public function close(){
                return true;
            }
            public function read($id){
                $value = $this->redis->get($id);
                if($value){
                    return $value;
                }else{
                    return "";
                }
            }
            public function write($id,$data){
                if($this->redis->set($id,$data)){
                    $this->redis->expire($id,$this->sessionExpireTime);  
                      //设置过期时间
                    return true;
                }
                return false;
            }
            public function destory($id){
                if($this->redis->delete($id)){
                    return true;
                }
                return false;
            }
            public function gc($maxlifetime){
                return true;
            }
            //析构函数
            public function __destruct(){
                session_write_close();
            }
             
    }
     
     
    $re = new SessionManager();
    $_SESSION['name'] = "qq";
    echo $_SESSION['name'];
  • 相关阅读:
    CSS基础应用学习系列(3)——图像的CSS阴影效果
    激活flash控件
    用一句SQL取出第 m 条到第 n 条记录的方法
    javascript检测浏览器和操作系统detect.js
    开始学习VS2008+.net3.5咯 :)
    用GridView编辑更新独立的单元格
    征服ASP.NET Ajax典型应用 (试读)
    CSS基础应用学习系列(4)――用CSS对列表应用样式
    Android SQLite学习指南
    Java内部类使用总结
  • 原文地址:https://www.cnblogs.com/yhdsir/p/5529162.html
Copyright © 2020-2023  润新知