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 相关文章推荐
Mysql的GROUP_CONCAT()函数使用方法
Mar 28 PHP
一个PHP数组应该有多大的分析
Jul 30 PHP
解析php取整的几种方式
Jun 25 PHP
PHP上传文件时文件过大$_FILES为空的解决方法
Nov 26 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
Apr 03 PHP
curl和libcurl的区别简介
Jul 01 PHP
Yii中的relations数据关联查询及统计功能用法详解
Jul 14 PHP
Yii框架用户登录session丢失问题解决方法
Jan 07 PHP
php创建图像具体步骤
Mar 13 PHP
PHP curl批处理及多请求并发实现方法分析
Aug 15 PHP
PHP抽象类与接口的区别详解
Mar 21 PHP
什么是PHP7中的孤儿进程与僵尸进程
Apr 14 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批量更改数据库表前缀实现方法
2013/10/26 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
2016/07/14 PHP
微信公众号模板消息群发php代码示例
2016/12/29 PHP
slice函数的用法 之不错的应用
2006/12/29 Javascript
JS的数组的扩展实例代码
2008/07/09 Javascript
Javascript中获取对象的原型对象的方法小结
2015/02/25 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
2016/07/01 Javascript
jQuery和JavaScript节点插入元素的方法对比
2016/11/18 Javascript
js仿微信语音播放实现思路
2016/12/12 Javascript
分享一道关于闭包、bind和this的面试题
2017/02/20 Javascript
Vue常用指令详解分析
2018/08/19 Javascript
Webpack4 使用Babel处理ES6语法的方法示例
2019/03/07 Javascript
vue组件数据传递、父子组件数据获取,slot,router路由功能示例
2019/03/19 Javascript
js时间戳转yyyy-MM-dd HH-mm-ss工具类详解
2019/04/30 Javascript
Python2.x中str与unicode相关问题的解决方法
2015/03/30 Python
python字符串中的单双引
2017/02/16 Python
Python利用递归和walk()遍历目录文件的方法示例
2017/07/14 Python
Python编写Windows Service服务程序
2018/01/04 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
django的model操作汇整详解
2019/07/26 Python
python爬虫豆瓣网的模拟登录实现
2019/08/21 Python
python如何求数组连续最大和的示例代码
2020/02/04 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
python 通过文件夹导入包的操作
2020/06/01 Python
让IE6、IE7、IE8支持CSS3的脚本
2010/07/20 HTML / CSS
ziaja齐叶雅官方海外旗舰店:来自波兰的天然护肤品牌
2017/01/02 全球购物
澳大利亚当地最大的时装生产商:Cue
2018/08/06 全球购物
几个SQL的面试题
2014/03/08 面试题
活动总结怎么写
2014/04/28 职场文书
2014年冬季防火方案
2014/05/21 职场文书
高中同学会活动方案
2014/08/14 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
2014年个人债务授权委托书范本
2014/09/22 职场文书
交通事故赔偿协议书怎么写
2014/10/04 职场文书
JavaScript如何利用Promise控制并发请求个数
2021/05/14 Javascript