Session
Session简介
- Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。
- 会话保持的机制,session 是记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存在服务器上。
session特点
- session保存的位置是在服务器端;
- session一般来说是要配合cookie使用,如果是浏览器禁用了cookie功能,也就只能够使用URL重写来实现session存储的功能;
- 单纯的使用session来维持用户状态的话,那么当同时登录的用户数量较多的时候,或者存在较多的数量的session会导致查询慢的问题。
- 本质上:session技术就是一种基于后端有别于数据库的临时存储数据的技术
使用session的原因
-
主要的一个原因就是HTTP的无状态性;
-
因为HTTP的无状态性,所以没有办法在HTTP发送请求的时候知道当前用户的状态,也就是比如说,当前是哪个用户的之类的这种信息,所以这个时候需要session来标识当前的状态。
session的工作原理
- 当一个session第一次被启用时,一个独一的标识被存储于本地的cookie中。
- 首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。
- 当执行PHP脚本时,通过使用session_register()函数注册session变量。
- 当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。
seesion的工作原理(模拟用户登录)
通过一个模拟用户登录的流程图来初步理解session的原理,假设这个时候用户执行登录操作,具体的session工作流程如下:
整个流程大概分成这样的几步:
-
第一步将本地的cookie中的session标识和用户名,密码带到后台中
-
第二步后台检测有没有对应的session标识,我们以php为例,那么就是检测有没有接收到对应的PHPSESSID
-
没有的话直接生成一个新的session。有的话,检测对应的文件是否存在并且有效
-
失效的话,我们需要清除session然后生成新的session。不失效,使用当前的session
看到这里你可能对session的工作原理有一个初步的理解
session的原理图如下:
session的一些相关注意事项
- 关闭浏览器session同样存在
- 如果我们没有人为的去设置cookie的生命周期的时候默认关闭浏览器session的状态是无法被保存下来的,因为没有设置cookie的生命周期,默认这个时候cookie为session cookie也就是在会话存在的时候cookie才有效,所以关闭浏览器cookie失效,导致后端拿不到对应的PHPSESSID,所以无法找到对应的session文件。
- session性能瓶颈怎样解决?
- 如果是后端存在大量的session的时候,那么这个时候就会出现性能的瓶颈,例如:当后端同时存在有5000个session文件的时候,假设要找的文件是在第4999个,那么也就是说前面至少需要遍历4998次,这样就会浪费过多的时间在后端的循环遍历查找文件中,所以这个时候最有效的方法是使用redis或者mongodb,原理是通过将原本保存在本地的session文件写入到内存中,通过内存换空间的形式来达到提升速度。
- 一般不使用URL重写的方法来传递PHPSESSID
- 其中主要有两个原因,一个是URL重写方式传递的话会导致URL混乱,影响美观。另一个是增大了用户误操作的几率。