为什么80%的码农都做不了架构师?>>>   

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

数据库代码

<?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'];

转载于:https://my.oschina.net/kakoi/blog/528522

PHP 实现Session入库/存入redis相关推荐

  1. PHP 实现Session入库/存入redis

    对于大访问量的站点使用默认的Session 并不合适,我们可以将其存入数据库.或者使用Redis KEY-VALUE数据存储方案 首先新建一个session表 CREATE TABLE `sessio ...

  2. session存入redis或memcached

    2019独角兽企业重金招聘Python工程师标准>>> session 存入 redis 的 php 配置 安装 redis 安装 phpredis 扩展 编辑 php.ini 配置 ...

  3. 深度实现session【包括session入库、session机制和session和cookie的使用方法,完善会话机制(在分布式机器中也能使用)】、无限分类的实现...

    1.session的注意点: @session_start();//这个配置需要注意,session开启中会有影响,所以使用错误抑制符进行限制[并且使用php.ini对session进行自动开启] s ...

  4. php session存到redis,php Session存储到Redis的方法

    php Session存储到Redis的方法 当然要写先安装php的扩展,可参考这篇文章:Redis及PHP扩展安装修改php.ini的设置 复制代码 代码如下: session.save_handl ...

  5. 8.redis解决分布式session问题 、redis在项目中难点

    a.什么是session session是一种会话技术,我们知道http是无状态协议的,就是这次连接传输数据后,下次连接服务器是不知道这次的请求是谁的,因此我们要做一个标记,让服务器知道每次请求是哪个 ...

  6. session共享(redis实现)

    引言 大厂很多项目都是部署到多台服务器上,这些服务器在各个地区都存在,当我们访问服务时虽然执行的是同一个服务,但是可能是不同服务器运行的: 在我学习项目时遇到这样一个登录情景,假设有如下三台服务器(如 ...

  7. 使用memcache的session入库

    使用memcache的session入库 Memcached是一款开源.高性能.分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序.它是 ...

  8. php 将查询出的数组数据存入redis

    我们从数据库查询出来的数据一般为数组的形式, 而redis是不支持存入数组的, 一种解决办法是将数组转化为json数据,再将json存入redis,之后取出时再将json转化为php数组. 但将取出的 ...

  9. Django搭建服务器,和微信小程序通信,验证码存入redis,用户信息存入mysql以及图片上传

    写在前面:整体是实现小程序的登录和注册,并接收验证码进行校验. 一.创建项目 django-admin startproject wxTest 二.注册app,进入到wxTest目录中 python ...

最新文章

  1. CF786B Legacy(线段树优化建边模板 + 最短路)
  2. Java程序员如何运用所掌握的技术构建一个完整的业务架构
  3. python用途与前景-Python 未来发展前景怎么样?
  4. Object C学习笔记12-集合
  5. 使用AFNetworking 报错提示
  6. 求水仙花_500万株水仙花争相绽放,这个日本小岛人少冬天还能看花!| 日本淡路岛...
  7. django mysql 创建表_关于 django ORM 中,数据库建表方式的问题
  8. C语言读取txt文档中的数据
  9. 热烈庆贺泰山字体引擎取得关键性突破
  10. paip.java gui swt/jface 最佳实践
  11. HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )
  12. 非科班程序员AI学习路径建议
  13. 《看完就懂系列》谈谈数据埋点的原理与实现
  14. 【Day4.4】堵车去暹罗商圈吃午餐
  15. 26.编辑距离(一)
  16. 我们要不要和to B“霸王龙”企业交朋友?
  17. 嵌入式学习之STM32实现OLED
  18. 开发那些事儿:在Flv.js前端播放器中解析并绘制H.264编码中的SEI信息
  19. java扫雷设计_毕业设计Java版扫雷的设计与实现介绍
  20. 传统电话网传真和网络传真的比较

热门文章

  1. iPhone折叠屏长啥样?网友迫不及待做出一个渲染视频
  2. 224秒!ImageNet上训练ResNet-50最佳战绩出炉,索尼下血本破纪录
  3. 3D版pix2pix来了,画一只猫就能抱起来吸丨github
  4. c#之线程总结(一)
  5. FJ省队集训DAY2 T2
  6. Hadoop本地库介绍及相关问题解决方法汇总
  7. 数据流重导向 -- 第11章   认识与学习 BASH
  8. Android OpenGL ES 开发教程(24):Depth Buffer
  9. 关于CMS的那点事 I
  10. NEO技术文章征集大赛