PHP实现Session入库/存入redis的方法


Posted in PHP onMay 04, 2017

对于大访问量的站点使用默认的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'];

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
discuz7 phpMysql操作类
Jun 21 PHP
一个简单php扩展介绍与开发教程
Aug 19 PHP
PHP gbk环境下json_dencode传送来的汉字
Nov 13 PHP
php登陆页的密码处理方式分享
Oct 14 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
Jun 19 PHP
php使用memcoder将视频转成mp4格式的方法
Mar 12 PHP
php通过array_merge()函数合并关联和非关联数组的方法
Mar 18 PHP
php根据日期显示所在星座的方法
Jul 13 PHP
php获取ajax的headers方法与内容实例
Dec 27 PHP
Laravel find in set排序实例
Oct 09 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 PHP
Yii Framework框架开发微信公众平台示例
Apr 26 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
May 04 #PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
May 04 #PHP
PHP调用Mailgun发送邮件的方法
May 04 #PHP
PHP实现图片的等比缩放和Logo水印功能示例
May 04 #PHP
Yii2数据库操作常用方法小结
May 04 #PHP
Yii2中添加全局函数的方法分析
May 04 #PHP
Yii2表单事件之Ajax提交实现方法
May 04 #PHP
You might like
PHP小程序自动提交到自助友情连接
2009/11/24 PHP
php模块memcache和memcached区别分析
2011/06/14 PHP
PHP与Java进行通信的实现方法
2013/10/21 PHP
php文件上传简单实现方法
2015/01/24 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
php获取ip及网址的简单方法(必看)
2017/04/01 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
2018/05/29 PHP
50个优秀经典PHP算法大集合 附源码
2020/08/26 PHP
js兼容标准的表格变色效果
2008/06/28 Javascript
正则表达式判断是否存在中文和全角字符和判断包含中文字符串长度
2008/09/27 Javascript
js中哈希表的几种用法总结
2014/01/28 Javascript
js使用for循环查询数组中是否存在某个值
2014/08/12 Javascript
js实现iframe跨页面调用函数的方法
2014/12/13 Javascript
项目中常用的JS方法整理
2015/01/30 Javascript
JavaScript从数组中删除指定值元素的方法
2015/03/18 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
2015/05/28 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
JS排序之选择排序详解
2017/04/08 Javascript
JavaScript运动框架 解决防抖动问题、悬浮对联(二)
2017/05/17 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
vue自定义表单生成器form-create使用详解
2019/07/19 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
python实现简单购物商城
2016/05/21 Python
Python中最大最小赋值小技巧(分享)
2017/12/23 Python
使用PM2+nginx部署python项目的方法示例
2018/11/07 Python
django 配置阿里云OSS存储media文件的例子
2019/08/20 Python
利用python下载scihub成文献为PDF操作
2020/07/09 Python
python实现逻辑回归的示例
2020/10/09 Python
HTML5实现获取地理位置信息并定位功能
2015/04/25 HTML / CSS
HTML5离线应用与客户端存储的实现
2018/05/03 HTML / CSS
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
防沙治沙典型材料
2014/05/07 职场文书
渠道运营商合作协议书范本
2014/10/06 职场文书
县委党的群众路线教育实践活动工作情况报告
2014/10/25 职场文书
建筑质检员岗位职责
2015/04/08 职场文书
2019企业文化管理制度范本!
2019/08/06 职场文书