解剖Session运行原理

本文深入解析Session的工作原理,包括其在服务器端的存储机制、与cookies的配合使用、配置方法及性能考量,探讨如何通过session维持用户会话状态,并提供PHP环境下session的实际应用案例。

1.Session(会话)本质是概念体系:Session会话(体系)实例堆区中存储着维持用户会话不断开所需要的一切特定属性及配置信息。通过Session会话(体系)实例可以实现服务器端保持链接不断进而实现数据转移通信存储技术。
2.Session会话本身的位置是在服务器端(云服务存储设备端),本地定义相应的session成员名接收云配置信息副本。Session通常配合cookies使用,如缺失cookies功能,则只能重写URL实现session存储属性及配置信息的功能。
3.用session会话体系来维持用户会话状态,当同时登录的用户数量较多或存在较多数量的session会话实例会导致查询较慢。
4.Session会话技术是基于后端但又有别于普通数据库存储的临时存储数据技术。
5.因为HTTP协议具有无状态性,在基于HTTP协议发送请求的时候,我们没有办法知道当前用户的属性及状态配置信息,比如当前是哪个用户该用户处于什么状态等信息无法通过无状态性的HTTP协议取得,需要session实例标识状态信息。
6.Session工作原理:
工作原理

  1. 将本地cookie中存储的 session标识 和 用户名、密码 传送至后台。

  2. 后台端检测查看有没有顺利接收到对应sessionID标识(以php为例就是后台端检测有没有接收到对应的PHP SESS ID)

  3. 没有的话直接生成一个新的session。已存在SessionID标识则检测ID标识相对应的文件是否存在且有效,若文件有效直接使用。若文件已失效则需要清除失效文件对应的实效session,然后构建新的有效session文件供使用。


在这里插入图片描述
7.Session常见配置(以PHP为例):
首先在PHP安装目录下面找到php.ini文件(php.ini文件主要作用对PHP进行配置)。

  1. 在cookie中为sessionID的标识字段名设置持有标识实例PHPSESSID。 对应的设置为:session.name = PHPSESSID
  2. 如客户端禁用cookie,通过设置session.use_trans_sid使标识的交互方式从cookie变为url传递(通过url标识上传后台)
对应的设置为: session.use_trans_sid = 0
  1. 设置sessionID标识所对应的session文件单元的存储位置

对应的设置是session.save_path=“D:\phpStudy\PHPTutorial\tmp\tmp”

8.PHP下Session实战:
在PHP下需要先安装wamp或者是phpstudy工具。
(1)Session文件单元本地端位置(在php.ini文件中找到session.save_path)
在这里插入图片描述
(2)session采用files的形式来保存。
在这里插入图片描述
(3)打开session文件,用函数session_start()给创建的session文件内添加一个变量名,假设名称demo1,值default

<?php /** * Created by PhpStorm. * Date: 2017/12/16 */ session_start();// 打开session $_SESSION["demo1"] = "default"; ?>

再次打开对应session文件:
在这里插入图片描述
修改session文件中的内容(对session文件中已有的成员访问修改)不会新建文件而是对文件远程访问执行重新写入操作。
(4)session会话文件(云端☁️)的销毁方式:unset和session_destroy(推荐使用)
(1)unset销毁

<?php /** * Created by PhpStorm. * Date: 2017/12/16 */ session_start();// 打开session文件 $_SESSION["demo1"] = "default_1"; unset($_SESSION);//session文件销毁(仅释放查找路径,没有删除session文件) ?>

=====================================

<?php /** * Created by PhpStorm. * Date: 2017/12/16 */ session_start();// 打开session $_SESSION["demo1"] = "default_1"; var_dump(session_name()); //session的销毁 session_destroy();//session文件销毁(释放查找路径,删除对应session文件(1.减少对硬盘的存储消耗2.优化session文件的查询速度)) ?>

(5)设置cookie(本地端)
备注:所谓本地端与云端相对而言并非绝对说法。
通过后端设置cookie文件(后端硬件区)默认自动传送给浏览器。函数session_name()获取cookie内key值(云session文件名)。函数session_id()获取cookie内key值(云sessionID标识)

<?php /** * Created by PhpStorm. * Date: 2017/12/16 */ session_start();// 打开session $_SESSION["demo1"] = "default_1"; setCookie(session_name(),session_id(),time()-1000); ?>

设置cookie时,为了程序的安全性,要禁止JS对cookie进行重写,需要设置HTTPONLY。在Php.ini文件中找到session.cookie_httponly = 1(true)。还可以通过setCookie和ini_set()来动态设置HTTPONLY属性。

<?php /** * Created by PhpStorm. * Date: 2017/12/16 */ session_start();// 打开session if ($_SESSION) { var_dump($_SESSION["demo1"]); } else { $_SESSION["demo1"] = "default_" . time(); var_dump($_SESSION["demo1"]); setCookie(session_name(), session_id(), time(), NULL, NULL, NULL, true); } ?>

Session相关注意事项:

  1. 关闭浏览器(云端☁️)后session文件同样存在(不调用/无法查找)
    默认关闭浏览器时session文件的状态标识是无法被保存,没有设置cookie生命周期,默认此时cookie为session cookie就是在会话session存在的时候cookie有效,关闭浏览器cookie失效,后端拿不到对应的PHPSESSID,无法找到对应的session文件。

  2. session性能瓶颈?
    如后端存在大量session文件(逐个循环查找),那么会出现性能瓶颈。如:当后端存在有5000个session文件,假设要找的session文件是处在第4999个,也就是说前面至少需要先遍历4998次,会浪费过多的时间在循环遍历查找文件中,这个时候最有效的方法是使用redis或mongodb,原理是通过将原本保存在本地端的session文件直接写入到临时内存中,通过消耗临时内存换空间提升速度。

  3. 一般不使用重写URL传递PHPSESSID
    两个原因(1)URL重写方式传递的话会导致URL混乱。(2)增大了用户误操作的几率。


PHP.ini文件中相关session的字段名:
[Session]
session.save_handler = files #session的存储方式
session.use_cookies= 1 #使用cookies在客户端保存会话
session.use_only_cookies = 1 #去保护URL中传送session id的用户
session.name = PHPSESSID #session名称(默认PHPSESSID)
session.auto_start = 0 #不启用请求自动初始化session
session.cookie_lifetime = 0 #cookie存活时间(0为直至浏览器重启,单位秒)
session.cookie_path = / #cookie的有效路径
session.cookie_domain = #cookie的有效域名
session.cookie_httponly = #httponly标记增加到cookie上(脚本语言无法抓取)
session.serialize_handler = php #PHP标准序列化

session.gc_probability =1
session.gc_divisor =1000 #建议设置1000-5000
#概率=session.gc_probability/session.gc_divisor(1/1000)
#页面访问越频繁概率越小
session.gc_maxlifetime =1440 #过期时间(默认24分钟,单位秒)

session.bug_compat_42 = off #全局初始化session变量
session.bug_compat_warn = off
session.referer_check = #防止带有ID的外部URL
session.entopy_length = 0 #读取的字节
session.cache_limiter = {nocache,private,pblic} #HTTP缓冲类型
session.cache_expire = 180 #文档过期时间(分钟)
session.use_trans_sid = 1 #trans_sid支持(默认0)
session.hash_function = 0 #hash方法{0:md5(128 bits),1:SHA-1(160 bits)}
session.hash_bits_per_character = 5 #当转换二进制hash数据奥可读形式是,每个字符保留位数
session.save_path = “/var/lib/php/session” #session id存放路径

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HaiJunYa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值