PHP使用Redis替代文件存储Session的方法


Posted in PHP onFebruary 15, 2017

本文实例讲述了PHP使用Redis替代文件存储Session的方法。分享给大家供大家参考,具体如下:

PHP默认使用文件存储session,如果并发量大,效率非常低。而Redis对高并发的支持非常好,所以,可以使用redis替代文件存储session

这里,介绍下php的session_set_save_handler 函数的作用和使用方法。该函数定义用户级session保存函数(如打开、关闭、写入等)。

原型如下:

bool session_set_save_hanler(callback open,callback close,callback read,callback write,callback destory,callback gc)

session_set_save_handler 函数各参数作用如下表

参 数 描述
open 当session打开时调用此函数。接收两个参数,第一个参数是保持session的路径,第二个参数是session的名字
close 当session操作完成时调用此函数。不接收参数。
read 以session ID作为参数。通过session ID从数据存储方中取得数据,并返回此数据。如果数据为空,可以返回一个空字符串。此函数在调用session_start 前被触发
write 当数据存储时调用。有两个参数,一个是session ID,另外一个是session的数据
destroy 当调用session_destroy 函数时触发destroy函数。只有一个参数 session ID
gc 当php执行session垃圾回收机制时触发

在使用该函数前,先把php.ini配置文件的session.save_handler选项设置为user,否则session_set_save_handle 不会生效。

编写一个session管理类sessionManager.php ,代码如下:

<?php
class SessionManager{
 private $redis;
 private $sessionSavePath;
 private $sessionName;
 private $sessionExpireTime=30;//redis,session的过期时间为30s
 public function __construct(){
 $this->redis = new Redis();//创建phpredis实例
 $this->redis->connect('127.0.0.1',6379);//连接redis
 $this->redis->auth("107lab");//授权
 $retval = session_set_save_handler(
  array($this,"open"),
  array($this,"close"),
  array($this,"read"),
  array($this,"write"),
  array($this,"destroy"),
  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);//获取redis中的指定记录
 if($value){
  return $value;
 }else{
  return '';
 }
 }
 public function write($id,$data){
 if($this->redis->set($id,$data)){//以session ID为键,存储
  $this->redis->expire($id,$this->sessionExpireTime);//设置redis中数据的过期时间,即session的过期时间
  return true;
 }
 return false;
 }
 public function destroy($id){
 if($this->redis->delete($id)){//删除redis中的指定记录
  return true;
 }
 return false;
 }
 public function gc($maxlifetime){
 return true;
 }
 public function __destruct(){
 session_write_close();
 }
}

SessionManager构造函数主要用来连接Redis服务器,使用session_set_save_handler函数设置session回调函数,并调用session_start函数开启session功能。因为本例中open、close和gc回调函数的作用不是很大,所以直接返回true。

在write回调函数中,以session ID 作为key,把session的数据作为value存储到redis服务器,设置session的过期时间为30秒。在read 回调函中,以session ID 作为key从redis服务器中读取数据,并返回此数据。而在destroy回调函数重,则以session ID 作为key 从redis服务器中删除对应的session数据。

使用时,只需包含SessionManager类,然后实例化一个SessionManager对象。下面建立个session_set.php文件。输入代码

<?php
 include('SessionManager.php');
 new SessionManager();
 $_SESSION['username'] = 'captain';

然后再创建一个session_get.php文件,输入如下代码:

<?php
 include('SessionManager.php');
 new SessionManager();
 echo $_SESSION['username'];

测试时,首先访问session_set.php,然后再访问 session_get.php,输出结果如下所示:

PHP使用Redis替代文件存储Session的方法

再查看redis数据库,如下所示

127.0.0.1:6379> keys *
1) "oe94eic337slnjv1bvlreoa574"
127.0.0.1:6379> get oe94eic337slnjv1bvlreoa574
"username|s:7:\"captain\";"

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
基于PHP的cURL快速入门教程 (小偷采集程序)
Jun 02 PHP
PHP不用第三变量交换2个变量的值的解决方法
Jun 02 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
Jan 14 PHP
PHP内核学习教程之php opcode内核实现
Jan 27 PHP
PHP的Yii框架入门使用教程
Feb 15 PHP
PHP简单创建压缩图的方法
Aug 24 PHP
Yii2中简单的场景使用介绍
Jun 02 PHP
PHP数据库编程之MySQL优化策略概述
Aug 16 PHP
php使用curl获取header检测开启GZip压缩的方法
Aug 15 PHP
Laravel 登录后清空COOKIE的操作方法
Oct 14 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 PHP
PHP中关于php.ini参数优化详解
Feb 28 PHP
Yii2中多表关联查询hasOne hasMany的方法
Feb 15 #PHP
php+Memcached实现简单留言板功能示例
Feb 15 #PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
Feb 14 #PHP
PHP中Trait及其应用详解
Feb 14 #PHP
php数组指针操作详解
Feb 14 #PHP
PHP中include()与require()的区别说明
Feb 14 #PHP
php中的抽象方法和抽象类
Feb 14 #PHP
You might like
PHP制作用户注册系统
2015/10/23 PHP
Zend Framework教程之Zend_Layout布局助手详解
2016/03/04 PHP
PHP XML和数组互相转换详解
2016/10/26 PHP
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
jQuery中判断一个元素是否为另一个元素的子元素(或者其本身)
2012/03/21 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
JQuery中解决重复动画的方法
2016/10/17 Javascript
jquery移除了live()、die(),新版事件绑定on()、off()的方法
2016/10/26 Javascript
微信小程序 欢迎界面开发的实例详解
2016/11/30 Javascript
jquery.flot.js简单绘制折线图用法示例
2017/03/13 Javascript
VUE中v-model和v-for指令详解
2017/06/23 Javascript
vue组件之Alert的实现代码
2017/10/17 Javascript
vue在使用ECharts时的异步更新和数据加载详解
2017/11/22 Javascript
微信小程序如何实现全局重新加载
2019/06/05 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
js异步接口并发数量控制的方法示例
2020/11/22 Javascript
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
Python编程中的文件读写及相关的文件对象方法讲解
2016/01/19 Python
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
Python Learning 列表的更多操作及示例代码
2018/08/22 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
详解Python循环作用域与闭包
2019/03/21 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
2019/08/06 Python
Python Django view 两种return的实现方式
2020/03/16 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
localstorage和sessionstorage使用记录(推荐)
2017/05/23 HTML / CSS
浅谈HTML5 FileReader分布读取文件以及其方法简介
2017/11/09 HTML / CSS
Joules美国官网:出色的英国风格
2017/10/30 全球购物
俄罗斯一家时尚女装商店:Charuel
2019/12/04 全球购物
长辈证婚人证婚词
2014/01/09 职场文书
卫生巾广告词
2014/03/18 职场文书
优秀班集体事迹材料
2014/12/25 职场文书
严以用权学习心得体会
2016/01/12 职场文书
Nginx防盗链与服务优化配置的全过程
2022/01/18 Servers
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python