PHP使用Redis实现Session共享的实现示例
时间:2022-07-27
本文章向大家介绍PHP使用Redis实现Session共享的实现示例,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
小型web服务, session数据基本是保存在本地(更多是本地磁盘文件), 但是当部署多台服务, 且需要共享session, 确保每个服务都能共享到同一份session数据.
redis 数据存储在内存中, 性能好, 配合持久化可确保数据完整.
设计方案
1. 通过php自身session配置实现
# 使用 redis 作为存储方案
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"
# 若设置了连接密码, 则使用如下
session.save_path = "tcp://127.0.0.1:6379?auth=密码"
测试代码
<?php
ini_set("session.save_handler", "redis");
ini_set("session.save_path", "tcp://127.0.0.1:6379");
session_start();
echo "<pre ";
$_SESSION['usertest'.rand(1,5)]=1;
var_dump($_SESSION);
echo "</pre ";
输出 ↓
array(2) { [“usertest1”]= int(88) [“usertest3”]= int(1) } usertest1|i:1;usertest3|i:1;
评价
- 优点: 实现简单, 无需修改php代码
- 缺点: 配置不支持多样化, 只能应用于简单场景
2. 设置用户自定义会话存储函数
通过 session_set_save_handler() 函数设置用户自定义会话函数.
session_set_save_handler ( callable $open , callable $close , callable $read , callable $write , callable $destroy , callable $gc [, callable $create_sid [, callable $validate_sid [, callable $update_timestamp ]]] ) : bool
# = php5.4
session_set_save_handler ( object $sessionhandler [, bool $register_shutdown = TRUE ] ) : bool
在配置完会话存储函数后, 再执行 session_start() 即可.
具体代码略, 以下提供一份 Memcached 的(来自Symfony框架代码):
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace SymfonyComponentHttpFoundationSessionStorageHandler;
/**
* MemcacheSessionHandler.
*
* @author Drak <drak@zikula.org
*/
class MemcacheSessionHandler implements SessionHandlerInterface
{
/**
* @var Memcache Memcache driver.
*/
private $memcache;
/**
* @var int Time to live in seconds
*/
private $ttl;
/**
* @var string Key prefix for shared environments.
*/
private $prefix;
/**
* Constructor.
*
* List of available options:
* * prefix: The prefix to use for the memcache keys in order to avoid collision
* * expiretime: The time to live in seconds
*
* @param Memcache $memcache A Memcache instance
* @param array $options An associative array of Memcache options
*
* @throws InvalidArgumentException When unsupported options are passed
*/
public function __construct(Memcache $memcache, array $options = array())
{
if ($diff = array_diff(array_keys($options), array('prefix', 'expiretime'))) {
throw new InvalidArgumentException(sprintf(
'The following options are not supported "%s"', implode(', ', $diff)
));
}
$this- memcache = $memcache;
$this- ttl = isset($options['expiretime']) ? (int) $options['expiretime'] : 86400;
$this- prefix = isset($options['prefix']) ? $options['prefix'] : 'sf2s';
}
/**
* {@inheritdoc}
*/
public function open($savePath, $sessionName)
{
return true;
}
/**
* {@inheritdoc}
*/
public function close()
{
return $this- memcache- close();
}
/**
* {@inheritdoc}
*/
public function read($sessionId)
{
return $this- memcache- get($this- prefix.$sessionId) ?: '';
}
/**
* {@inheritdoc}
*/
public function write($sessionId, $data)
{
return $this- memcache- set($this- prefix.$sessionId, $data, 0, time() + $this- ttl);
}
/**
* {@inheritdoc}
*/
public function destroy($sessionId)
{
return $this- memcache- delete($this- prefix.$sessionId);
}
/**
* {@inheritdoc}
*/
public function gc($maxlifetime)
{
// not required here because memcache will auto expire the records anyhow.
return true;
}
/**
* Return a Memcache instance
*
* @return Memcache
*/
protected function getMemcache()
{
return $this- memcache;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助。
- NLP真实项目:利用这个模型能够通过商品评论去预测一个商品的销量
- python + selenium + PhantomJS 获取腾讯应用宝APP评论
- 简单实用的sql小技巧(第二篇)(r3笔记第86天)
- Java代码效率优化【面试+提高】
- 利用逻辑回归模型判断用户提问意图
- 关于reset sequence(r3笔记第85天)
- 【编程基础第十二讲】web开发编程基础--回调函数
- typeof的一些兼容性问题
- 类型转换的判定方式
- 【Java案例】打印杨辉三角
- html标签属性(attribute)和dom元素的属性(property)
- 关于long类型的转换(r3笔记第84天)
- jQuery的事件模型
- 关于索引的内部信息(r3笔记第83天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 变废为宝 | 旧电脑变云数据中心 | Esxi 配置
- 【Java面试总结】Java基础(上篇)
- Esxi安装LEDE(OpenWrt) | 旧电脑变庞路由
- [白话解析] 深入浅出贝叶斯定理
- LEDE(OpenWrt)安装openclash |旁路由技巧 | 配置网络流量全部通过旁路由
- [白话解析] 深入浅出朴素贝叶斯模型原理及应用
- 【Java面试总结】Java基础(下篇)
- 使用现代化的脚本进行 ArcGIS JS API 开发
- TextField suffixIcon点击时TextField 选中弹出键盘<Flutter Bug篇>
- seata redis模式重构之全局事务更新
- 【STM32F407】第7章 RL-TCPnet V7.X网络协议栈移植(RTX5)
- 【STM32F429】第7章 RL-TCPnet V7.X网络协议栈移植(RTX5)
- [白话解析] 深入浅出 极大似然估计 & 极大后验概率估计
- 【STM32H7】第7章 RL-TCPnet V7.X网络协议栈移植(RTX5)
- TinyMCE 富文本编辑器的使用实例指导