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功能类,用来演示具体的实现过程,只实现了写和读功能(没有考虑会话有效期、并发等问题)。

  1. /**
  2. * Session类简单实现
  3. * @author zhjx922
  4. */
  5. class Session
  6. {
  7. //当前sessionId
  8. private $_sessionId;
  9. //session的储存路径
  10. private $_sessionPath = '/tmp/session';
  11. /**
  12. * 初始化sessionId
  13. */
  14. public function __construct()
  15. {
  16. if(isset($_COOKIE['PHPSESSID']) && $this->checkSession($_COOKIE['PHPSESSID'])) {
  17. $this->_sessionId = $_COOKIE['PHPSESSID'];
  18. } else {
  19. $this->_sessionId = uniqid();
  20. setcookie("PHPSESSID", $this->_sessionId);
  21. }
  22. }
  23. /**
  24. * 设置session
  25. * @param string $key
  26. * @param mixed $value
  27. */
  28. public function setSession($key, $value)
  29. {
  30. $sessionInfo = $this->getSessionInfo();
  31. $sessionInfo[$key] = $value;
  32. $sessionFile = "{$this->_sessionPath}/{$this->_sessionId}";
  33. file_put_contents($sessionFile, serialize($sessionInfo));
  34. }
  35. /**
  36. * 获取session
  37. * @param string $key
  38. * @return mixed
  39. */
  40. public function getSession($key)
  41. {
  42. return $this->getSessionInfo()[$key];
  43. }
  44. /**
  45. * 获取当前sessionId下的内容
  46. * @return array
  47. */
  48. private function getSessionInfo()
  49. {
  50. if(!is_dir($this->_sessionPath))
  51. {
  52. mkdir($this->_sessionPath);
  53. }
  54. $sessionFile = "{$this->_sessionPath}/{$this->_sessionId}";
  55. if(is_file($sessionFile)) {
  56. $contents = file_get_contents($sessionFile);
  57. return unserialize($contents);
  58. }
  59. return [];
  60. }
  61. /**
  62. * 检查session是否有效
  63. * @param string $sessionId
  64. * @return bool
  65. */
  66. private function checkSession($sessionId)
  67. {
  68. $sessionFile = "{$this->_sessionPath}/{$sessionId}";
  69. if(is_file($sessionFile)) {
  70. return true;
  71. }
  72. return false;
  73. }
  74. }

使用方法如下

  1. $session = new Session();
  2. $session->setSession('a', 'b'); //第二次访问时注释掉这行,验证下一行$session->getSession('a')输出的内容是否正确
  3. 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. bzoj 2178 圆的面积并【simpson积分】

    直接套simpson,f可以直接把圆排序后扫一遍所有圆,这样维护一个区间就可以避免空段. 然而一定要去掉被其他圆完全覆盖的圆,否则会TLE #include<iostream> #incl ...

  2. 洛谷 P3254 圆桌问题【最大流】

    s向所有单位连流量为人数的边,所有饭桌向t连流量为饭桌容量的边,每个单位向每个饭桌连容量为1的边表示这个饭桌只能坐这个单位的一个人.跑dinic如果小于总人数则无解,否则对于每个单位for与它相连.满 ...

  3. bzoj3316: JC loves Mkk(单调队列+分数规划)

    Description Input 第1行,包含三个整数.n,L,R.第2行n个数,代表a[1..n]. Output 仅1行,表示询问答案.如果答案是整数,就输出整数:否则,输出既约分数“P/Q”来 ...

  4. 结对测试vs随机测试

    在接口测试过程中,最关键的是对参数的各种情况进行测试. 随机测试是指随机选择一些参数值来测. 结对测试是指parewise算法生成较高"性价比"的组合情况来测. 随机测试存在的问题 ...

  5. [BUG]Dreamweaver6做网页的一个图片文字不清晰的问题

    自己用Dreamweaver6做一个网页,使用PS做图片,为了节约下载流量,我把图片裁剪为GIF格式,通过系统自带的图片浏览器和美图看看,图片上的文字都是清晰的. 我把图片加载进入DW中后,在DW界面 ...

  6. js中实现json格式的转换

    function person(id,name,age){ this.id=id; this.name=name; this.age=age; } var p=new person(1001,'tom ...

  7. 升序 Collections.sort(list) 降序 Collections.reserve(list) 随机 Collections.shuffle(list)

    package Day28ketangzuoye; import java.util.ArrayList; import java.util.Collections; import java.util ...

  8. C语言中Static和Const关键字的的作用 -- 转

    static作用:“改变生命周期” 或者 “改变作用域” 程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中. 1.作用于变量: 用static声明局部变量-- ...

  9. chromedriver与chrome版本对应

    今天把手头有的一些关于selenium测试的资源整理了一下,分享出来. 1. 所有版本chrome下载 是不是很难找到老版本的chrome?博主收集了几个下载chrome老版本的网站,其中哪个下载的是 ...

  10. 424 Longest Repeating Character Replacement 替换后的最长重复字符

    给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度.注意:字符串长度 和 k 不会超过 104. ...