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功能的更多相关文章

  1. 在Sharepoint 2010中启用Session功能的说明文档

    在Sharepoint 2010中启用Session功能的说明文档 开发环境:Windows 7系统,SharePoint Server 2010,Visual Studio 2010 按以下步骤进行 ...

  2. 基于django的自定义简单session功能

    基于django的自定义简单session功能 简单思路: 1.建立自定义session数据库 2.登入时将用户名和密码存入session库 3.将自定义的随机session_id写入cookie中 ...

  3. 用Redis实现Session功能

    0.什么是Redis Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API ---维基百科 1.与其他用户状态保存方 ...

  4. winform实现Session功能(保存用户信息)

    问题描述:在winform中想实现像BS中类似Session的功能,放上需要的信息,在程序中都可以访问到. 解决方案:由于自己很长时间没有做过winform的程序,一时间竟然手足无措起来.后来发现wi ...

  5. 启用 mvc webapi 的 session功能可用

    默认 mvc webapi 不开启 session 会话支持 所以需要修改配置,在 Global 开启 session 支持 如下: 1.重写 init() 方法 public override vo ...

  6. 分布式中使用Redis实现Session共享(二)

    上一篇介绍了一些redis的安装及使用步骤,本篇开始将介绍redis的实际应用场景,先从最常见的session开始,刚好也重新学习一遍session的实现原理.在阅读之前假设你已经会使用nginx+i ...

  7. ApiController使用Session验证出现Null解决方案

    问题描述 在服务端保存登录信息,出现异常信息 分析发现HttpContext.Current.Session为null 解决方案 执行时出报异常,要在Global.asax里添加:开启Session功 ...

  8. ASP.NET Session 详解

    阅读本文章之前的准备 阅读本文章前,需要读者对以下知识有所了解.否则,阅读过程中会在相应的内容上遇到不同程度的问题. 懂得ASP/ASP.NET编程 了解ASP/ASP.NET的Session模型 了 ...

  9. IIS下Asp.Net应用程序多进程设置及Session共享

    背景: 目前项目中在单个进程的应用程序经常会遇到w3c.exe崩溃的情况,于是就设想是否可以通过IIS多进程的方案来避免出现该问题. 于是搜了下“怎么实现多进程的方案”,找到了这篇文章:http:// ...

随机推荐

  1. thinkphp5.0常遇到的错误

    call a member xxxx on null 1.一般是没有继承controller: 2.对象和数组使用错误.

  2. 设置Google搜索在新的标签页打开

    Google搜索的结果,默认情况下点击进入是在本标签页打开的,这样就很麻烦, 可以在搜索结果的页面中进行设置,让它在新的标签页显示 搜索结果设置->搜索设置->新的标签页打开

  3. oracle ORA-01704: string literal too long问题分析

    今天使用sql在oracle直接insert update一个表时,出现ORA-01704: string literal too long的错误,我们的sql是 update mall_config ...

  4. 二分查找/暴力 Codeforces Round #166 (Div. 2) B. Prime Matrix

    题目传送门 /* 二分查找/暴力:先埃氏筛选预处理,然后暴力对于每一行每一列的不是素数的二分查找最近的素数,更新最小值 */ #include <cstdio> #include < ...

  5. Person p = new Person("zhangsan",20);该句话都做了什么事情?

    1,因为new用到了Person.class.所以会先找到Person.class文件并加载到内存中.2,执行该类中的static代码块,如果有的话,给Person.class类进行初始化.3,在堆内 ...

  6. php之依赖注入和控制反转

      DI——Dependency Injection   依赖注入  IoC——Inversion of Control  控制反转  要想理解上面两个概念,就必须搞清楚如下的问题: 1.参与者都有谁 ...

  7. 直接插入排序法原理及其js实现

    直接插入排序法就像我们打扑克牌时整理牌面一样,先让我们脑补一下我们打牌的过程. 首先摸了一张6, 接着摸到一张4,比6小,插到6的前面: 又摸到一张7,比6大,插到6的后面: 又摸到一张5,比6小,比 ...

  8. WP7 开发资料

    前言 离Windows Phone 7正式发布已过去几个月了,但国内关于Windows Phone 7的中文书籍资料太少了,大多数是英文资料,一本真正的中文开发教程书都没有, 要啃英文资料对大部分的开 ...

  9. git介绍与使用

    git是去中心化版本管理工具,项目创建一个远程版本,将其clone到本地,会在本地创建一个本地仓,一个开发项目,在没有网络的时候依然可以提交修改到本地仓,当有网络的时候再提交到远程仓库.git可以快速 ...

  10. SQL 触发器-如何查看当前数据库中有哪些触发器

    在查询分析器中运行: use 数据库名goselect * from sysobjects where xtype='TR' sysobjects 保存着数据库的对象,其中 xtype 为 TR 的记 ...