Session

Session简介

  • Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。
  • 会话保持的机制,session 是记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存在服务器上。

session特点

  1. session保存的位置是在服务器端;
  2. session一般来说是要配合cookie使用,如果是浏览器禁用了cookie功能,也就只能够使用URL重写来实现session存储的功能;
  3. 单纯的使用session来维持用户状态的话,那么当同时登录的用户数量较多的时候,或者存在较多的数量的session会导致查询慢的问题。
  • 本质上:session技术就是一种基于后端有别于数据库的临时存储数据的技术

使用session的原因

  • 主要的一个原因就是HTTP的无状态性;

  • 因为HTTP的无状态性,所以没有办法在HTTP发送请求的时候知道当前用户的状态,也就是比如说,当前是哪个用户的之类的这种信息,所以这个时候需要session来标识当前的状态。

session的工作原理

  1. 当一个session第一次被启用时,一个独一的标识被存储于本地的cookie中。
  2. 首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。
  3. 当执行PHP脚本时,通过使用session_register()函数注册session变量。
  4. 当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。

seesion的工作原理(模拟用户登录)

通过一个模拟用户登录的流程图来初步理解session的原理,假设这个时候用户执行登录操作,具体的session工作流程如下:
Session
整个流程大概分成这样的几步:

  1. 第一步将本地的cookie中的session标识和用户名,密码带到后台中

  2. 第二步后台检测有没有对应的session标识,我们以php为例,那么就是检测有没有接收到对应的PHPSESSID

  3. 没有的话直接生成一个新的session。有的话,检测对应的文件是否存在并且有效

  4. 失效的话,我们需要清除session然后生成新的session。不失效,使用当前的session

看到这里你可能对session的工作原理有一个初步的理解

session的原理图如下:
Session

session的一些相关注意事项

  1. 关闭浏览器session同样存在
  • 如果我们没有人为的去设置cookie的生命周期的时候默认关闭浏览器session的状态是无法被保存下来的,因为没有设置cookie的生命周期,默认这个时候cookie为session cookie也就是在会话存在的时候cookie才有效,所以关闭浏览器cookie失效,导致后端拿不到对应的PHPSESSID,所以无法找到对应的session文件。
  1. session性能瓶颈怎样解决?
  • 如果是后端存在大量的session的时候,那么这个时候就会出现性能的瓶颈,例如:当后端同时存在有5000个session文件的时候,假设要找的文件是在第4999个,那么也就是说前面至少需要遍历4998次,这样就会浪费过多的时间在后端的循环遍历查找文件中,所以这个时候最有效的方法是使用redis或者mongodb,原理是通过将原本保存在本地的session文件写入到内存中,通过内存换空间的形式来达到提升速度。
  1. 一般不使用URL重写的方法来传递PHPSESSID
  • 其中主要有两个原因,一个是URL重写方式传递的话会导致URL混乱,影响美观。另一个是增大了用户误操作的几率。