如何自己实现session功能
session字如其意,它的存在就是为了保持会话状态。PHP中的$_SESSION让我们很方便的使用它,但是如果PHP本身不提供这个功能,我们该如何实现呢?且听我慢慢忽悠。
session的实现原理
session本身的实现原理其实很简单,几句话就可以说完
- 用户首次访问时生成唯一ID(其实就是PHP中的
session_id) - 根据session_id作为唯一标示,生成session_id为名称的文件(储存session内容,当然也可以存到redis或者mysql中)
- 通过cookie下发
session_id到客户端 - 用户再次访问时会通过cookie将
session_id带上 - 服务端通过
session_id获取对应的session内容(文件、Cache、数据库)
代码实现
下面是我通过PHP实现的一个简单的session功能类,用来演示具体的实现过程,只实现了写和读功能(没有考虑会话有效期、并发等问题)。
/**
* Session类简单实现
* @author zhjx922
*/
class Session
{
//当前sessionId
private $_sessionId;
//session的储存路径
private $_sessionPath = '/tmp/session';
/**
* 初始化sessionId
*/
public function __construct()
{
if(isset($_COOKIE['PHPSESSID']) && $this->checkSession($_COOKIE['PHPSESSID'])) {
$this->_sessionId = $_COOKIE['PHPSESSID'];
} else {
$this->_sessionId = uniqid();
setcookie("PHPSESSID", $this->_sessionId);
}
}
/**
* 设置session
* @param string $key
* @param mixed $value
*/
public function setSession($key, $value)
{
$sessionInfo = $this->getSessionInfo();
$sessionInfo[$key] = $value;
$sessionFile = "{$this->_sessionPath}/{$this->_sessionId}";
file_put_contents($sessionFile, serialize($sessionInfo));
}
/**
* 获取session
* @param string $key
* @return mixed
*/
public function getSession($key)
{
return $this->getSessionInfo()[$key];
}
/**
* 获取当前sessionId下的内容
* @return array
*/
private function getSessionInfo()
{
if(!is_dir($this->_sessionPath))
{
mkdir($this->_sessionPath);
}
$sessionFile = "{$this->_sessionPath}/{$this->_sessionId}";
if(is_file($sessionFile)) {
$contents = file_get_contents($sessionFile);
return unserialize($contents);
}
return [];
}
/**
* 检查session是否有效
* @param string $sessionId
* @return bool
*/
private function checkSession($sessionId)
{
$sessionFile = "{$this->_sessionPath}/{$sessionId}";
if(is_file($sessionFile)) {
return true;
}
return false;
}
}
使用方法如下
$session = new Session();
$session->setSession('a', 'b'); //第二次访问时注释掉这行,验证下一行$session->getSession('a')输出的内容是否正确
var_dump($session->getSession('a'));
是不是特别简单呢?使用每个功能的时候多想一下它是怎么实现的,很多时候能够让我们快速定位到问题的所在~
原文地址:https://segmentfault.com/a/1190000015606464
如何自己实现session功能的更多相关文章
- 在Sharepoint 2010中启用Session功能的说明文档
在Sharepoint 2010中启用Session功能的说明文档 开发环境:Windows 7系统,SharePoint Server 2010,Visual Studio 2010 按以下步骤进行 ...
- 基于django的自定义简单session功能
基于django的自定义简单session功能 简单思路: 1.建立自定义session数据库 2.登入时将用户名和密码存入session库 3.将自定义的随机session_id写入cookie中 ...
- 用Redis实现Session功能
0.什么是Redis Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API ---维基百科 1.与其他用户状态保存方 ...
- winform实现Session功能(保存用户信息)
问题描述:在winform中想实现像BS中类似Session的功能,放上需要的信息,在程序中都可以访问到. 解决方案:由于自己很长时间没有做过winform的程序,一时间竟然手足无措起来.后来发现wi ...
- 启用 mvc webapi 的 session功能可用
默认 mvc webapi 不开启 session 会话支持 所以需要修改配置,在 Global 开启 session 支持 如下: 1.重写 init() 方法 public override vo ...
- 分布式中使用Redis实现Session共享(二)
上一篇介绍了一些redis的安装及使用步骤,本篇开始将介绍redis的实际应用场景,先从最常见的session开始,刚好也重新学习一遍session的实现原理.在阅读之前假设你已经会使用nginx+i ...
- ApiController使用Session验证出现Null解决方案
问题描述 在服务端保存登录信息,出现异常信息 分析发现HttpContext.Current.Session为null 解决方案 执行时出报异常,要在Global.asax里添加:开启Session功 ...
- ASP.NET Session 详解
阅读本文章之前的准备 阅读本文章前,需要读者对以下知识有所了解.否则,阅读过程中会在相应的内容上遇到不同程度的问题. 懂得ASP/ASP.NET编程 了解ASP/ASP.NET的Session模型 了 ...
- IIS下Asp.Net应用程序多进程设置及Session共享
背景: 目前项目中在单个进程的应用程序经常会遇到w3c.exe崩溃的情况,于是就设想是否可以通过IIS多进程的方案来避免出现该问题. 于是搜了下“怎么实现多进程的方案”,找到了这篇文章:http:// ...
随机推荐
- [POI2008]BLO-Blockade 【无向图tarjan/鸽点】By cellur925
题目传送门 lyd无向图tarjan的例题. 一句话题意(不得不佩服lyd老师的高度概括能力):在一张无向连通图上,求出每个点被破坏(去掉与这个点相关的所有边,不去掉这个点)后,无向图中使i,j不连通 ...
- Six degrees of Kevin Bacon
转自:https://blog.csdn.net/a17865569022/article/details/78766867 Input* Line 1: Two space-separated in ...
- 2015湘潭市第七届大学生程序设计竞赛 —— Fraction
题目大意: 小数化分数,但是分母限制在[1,1000],很明显的枚举,但是在赛场上的时候傻逼了,无论怎么枚举,怎么二分就是wa,wa到死···········. (ps:我要给出题人寄刀片~~~~), ...
- C/C++带有空格的字符串输入
一.带有空格的字符串输入 (一)C++篇 1. 针对字符数组而言 方法一 getline() 读入整行数据,使用回车键输入换行符来确定输入结尾. 调用方法: cin.getline(str,len) ...
- Android上的进程通信(IPC)机制
Interprocess Communication Android offers a mechanism for interprocess communication (IPC) using rem ...
- Access OLE对象和附件的区别
OLE 对象 来自 Office 和基于 Windows 的程序的图像.文档.图形和其他对象 最多可存储 2GB 数据(此大小限制适用于所有 Access 数据库).请记住,添加 2GB 数据会导致数 ...
- 使用mysql实现mybatis的分页效果
1.mybatis.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configur ...
- D. Green and Black Tea 贪心 + 构造
http://codeforces.com/contest/746/problem/D 首先说下一定是NO的情况. 假设a > b 那么,b最多能把a分成b + 1分,如果每份刚好是k的话,那么 ...
- spark yarn cluster模式下任务提交和计算流程分析
spark可以运行在standalone,yarn,mesos等多种模式下,当前我们用的最普遍的是yarn模式,在yarn模式下又分为client和cluster.本文接下来将分析yarn clust ...
- 前端--1、HTML基础
web服务 处于应用层的http协议负责的数据传输与解析.位于socket上层,用socket传输http数据时需要在消息开头处声明是http协议/相应http版本 状态码 状态码含义 \r\n\r\ ...