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将数据导入到Foxmail
Oct 09 PHP
PHP与MySQL开发中页面出现乱码的一种解决方法
Jul 29 PHP
请离开include_once和require_once
Jul 18 PHP
PHP mail()函数使用及配置方法
Jan 14 PHP
Codeigniter实现多文件上传并创建多个缩略图
Jun 12 PHP
php实现简易聊天室应用代码
Sep 23 PHP
php三种实现多线程类似的方法
Oct 30 PHP
php cookie工作原理与实例详解
Jul 18 PHP
php实现微信扫码自动登陆与注册功能
Sep 22 PHP
PHP数组中头部和尾部添加元素的方法(array_unshift,array_push)
Apr 10 PHP
PHP获取二叉树镜像的方法
Jan 17 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
Oct 11 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
php猴子选大王问题解决方法
2015/05/12 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
arguments对象
2006/11/20 Javascript
Jquery知识点一 Jquery的ready和Dom的onload的区别
2011/01/15 Javascript
Js判断CSS文件加载完毕的具体实现
2014/01/17 Javascript
node.js适合游戏后台开发吗?
2014/09/03 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
2015/01/22 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
2015/06/19 Javascript
JS实现超精简响应鼠标显示二级菜单代码
2015/09/12 Javascript
js 弹出虚拟键盘修改密码的简单实例
2016/10/10 Javascript
js原生之焦点图转换加定时器实例
2016/12/12 Javascript
JS实现移动端按首字母检索城市列表附源码下载
2017/07/05 Javascript
Nodejs下使用gm圆形裁剪并合成图片的示例
2018/02/22 NodeJs
基于JS实现web端录音与播放功能
2019/04/17 Javascript
在Python的Flask框架中使用模版的入门教程
2015/04/20 Python
python搭建虚拟环境的步骤详解
2016/09/27 Python
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
zookeeper python接口实例详解
2018/01/18 Python
Python numpy实现二维数组和一维数组拼接的方法
2018/06/05 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
Python如何在bool函数中取值
2020/09/21 Python
python实现经纬度采样的示例代码
2020/12/10 Python
官方授权图形T恤和服装:Fifth Sun
2019/06/12 全球购物
经济系大学生求职信
2013/10/01 职场文书
机械制造与自动化应届生求职信
2013/11/16 职场文书
党的群众路线教育实践活动批评与自我批评
2014/02/16 职场文书
机械制造毕业生求职信
2014/03/03 职场文书
教育英语专业毕业生的求职信
2014/03/13 职场文书
党员示范岗材料
2014/12/19 职场文书
廉洁自律个人总结
2015/02/14 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书
Python下载商品数据并连接数据库且保存数据
2022/03/31 Python
python套接字socket通信
2022/04/01 Python