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 相关文章推荐
php 发送带附件邮件示例
Jan 23 PHP
关于php支持分块与断点续传文件下载功能代码
May 09 PHP
JavaScript创建命名空间的5种写法
Jun 24 PHP
PHP中读取文件的8种方法和代码实例
Aug 05 PHP
php出现web系统多域名登录失败的解决方法
Sep 30 PHP
php实现图片文件与下载文件防盗链的方法
Nov 03 PHP
php防止网站被刷新的方法汇总
Dec 01 PHP
1亿条数据如何分表100张到Mysql数据库中(PHP)
Jul 29 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
Nov 24 PHP
详解PHP中array_rand函数的使用方法
Sep 11 PHP
使用PHPExcel导出Excel表
Sep 08 PHP
PHP异常类及异常处理操作实例详解
Dec 19 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学习之数据类型之间的转换介绍
2011/06/09 PHP
微信扫描二维码登录网站代码示例
2013/12/30 PHP
PHP 正则表达式常用函数
2014/08/17 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
2015/12/29 PHP
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
深入理解Javascript中的循环优化
2013/11/09 Javascript
JavaScript改变HTML元素的样式改变CSS及元素属性
2013/11/12 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
Javascript实现多彩雪花从天降散落效果的方法
2015/02/02 Javascript
jQuery实现二级下拉菜单效果
2016/01/05 Javascript
基于JavaScript实现动态添加删除表格的行
2016/02/01 Javascript
js创建对象几种方式的优缺点对比
2016/09/28 Javascript
概述如何实现一个简单的浏览器端js模块加载器
2016/12/07 Javascript
jQuery返回定位插件详解
2017/05/15 jQuery
Angular2中如何使用ngx-translate进行国际化
2017/05/21 Javascript
Angular2生命周期钩子函数的详细介绍
2017/07/10 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
vscode中vue-cli项目es-lint的配置方法
2018/07/30 Javascript
详解Vue中使用Axios拦截器
2019/04/22 Javascript
vue中使用WX-JSSDK的两种方法(推荐)
2020/01/18 Javascript
解决React在安装antd之后出现的Can't resolve './locale'问题(推荐)
2020/05/03 Javascript
如何利用Node.js与JSON搭建简单的动态服务器
2020/06/16 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
如何在 Vue 表单中处理图片
2021/01/26 Vue.js
[01:02:25]2014 DOTA2华西杯精英邀请赛 5 24 iG VS DK
2014/05/26 DOTA
自己使用总结Python程序代码片段
2015/06/02 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
毕业生如何写自我鉴定
2014/03/15 职场文书
就业推荐表自我鉴定
2014/03/21 职场文书
学生会宣传部竞选稿
2015/11/21 职场文书
2016年“5.12”护士节慰问信
2015/11/30 职场文书
在 SQL 语句中处理 NULL 值的方法
2021/06/07 SQL Server