首页 > 其他分享 >Session的运行机制

Session的运行机制

时间:2024-08-31 11:48:26浏览次数:4  
标签:session 文件 name Session gc 运行机制 cookie id

浏览器通过web访问服务器,服务器的web服务开启后,第一步就是开启session,这也是session的第一阶段:

session_start()

  这个函数的作用:开启session,然后根据以前设置的session_name去读取cookie信息,判断$_Cookies[$session_name]判断是否有值,也就是是否存在session_id,如果存在就用这个session_id,如果没有就会随机生成一个唯一的32位的数值,将这个数值赋值给session_id。这个session_id就代表当前访问的用户。然后初始化$SESSION这个变量,根据session_id读取session文件中的内容(如果有session_id所对应的保存文件的话),把内容反序列化之后赋值到$SESSION这个变量中,这个阶段还有一个特别关键的作用,还会判断那些session文件已经过期,调用gc进程,删除掉过期的session文件。gc如何判断文件是否过期,如何操作后面再说

session_start(); echo "SID: ".SID.""; echo "session_id(): ".session_id().""; echo "COOKIE: ".$_COOKIE["PHPSESSID"];
输出:
SID:PHPSESSID=bjjwfoo45hajsjv89trsgtiertbuiwom
session_id():bjjwfoo45hajsjv89trsgtiertbuiwom
cookie:提示Notice:undefined index:PHPSESSID
这个因为浏览器第一次请求还没有在cookie中存储session_id,这个cookie的一个特性,只有当第一次请求之后,服务器接收到请求才在服务器端设置cookie,存储session_id。
注意:cookie中存储的session_id默认是会话时间

SID:是系统常量,SID包含着会话名以及会话ID的常量,格式为“name=ID”,如果cookie中已经存在session_id,SID就为一个空字符串,不然就是"name=ID"

第二阶段就是脚本运行期间:
php只是对$_SESSION这个变量进行增删改查的操作,需要注意:这个阶段并没有影响到session文件里面的内容,除非你在这个阶段session_destroy()了,除此之外,该阶段不会对session文件有任何影响

第三阶段:脚本执行结束
在这个阶段才会对session文件进行操作,也就是这个阶段才会把$_SESSION数组中的数据序列化然后存储到session文件。

session的存储方式

默认会存储在服务器的临时目录,以文件的形式存储,文件名为(sess_+session_id),这些都可以在php.ini文件中配置,文件内容为序列化的数据,如下:

$_SESSION['name'] = ‘张三'
$_SESSION['age'] = 18
session文件为:
    name|i:张三;age|i:18

下面是常用的php.ini文件中sessionde相关配置:

session.save_handler = files    #规定session的存储方式,默认是文件,还可以是redis或者是memcache,提升效率
session.save_path = "d:/wamp/tmp"    #规定session文件的存储目录
session.use_cookies = 1    #是否使用cookie存储session_id
session.name = PHPSESSID    #客户端存储session_id的会话名
session.auto_start = 0    #是否自动开启session
session.cookie_lifetime = 0    #设置客户端中存储的session_id的过期时间,注意session的过期时间是间隔的,比如20分钟过期,重新访问了,session的过期时间会重新计算,cookie的过期时间是累记的
session.serialize_handler = php
session.gc_divisor = 1000
session.gc_probability = 1
session.gc_maxlifetime = 1440    #设置session文件的过期时间

session的垃圾回收机制

一个用户访问服务器会产生一个session文件,关闭浏览器,然后在访问服务器又会产生一个新的session文件,这样session的垃圾文件就会很多,长时间不清理就会占用大量的磁盘空间,访问session文件的速度也会降低,gc进程垃圾回收就很有必要了
先提一下PHP的一些清理session的函数

unset($_SESSION['name'])    清理某个变量
session_unset()    不传参数,清除所有的session变量,但是session文件还在
session_destroy()    清除session文件
setcookie(session_name(), '', time()-1000, '/')    设置cookie文件过期

注意:一般做了session_destroy()操作之后,setcookie(session_name(), '', time()-1000, '/')也是必须的,不然用户重新刷新页面,又会设置一样的session_id,产生session文件

然后就是gc自动删除垃圾文件:

session.gc_divisor = 1000
session.gc_probability = 1
session.gc_maxlifetime = 1440    #设置session文件的过期时间

删除session垃圾文件的概率是,session.gc_probability/session.gc_divisor=1/1000,也就是说每次session_start()都会有1/1000的概率触发gc进程,但是1000次中必会有一次,如果session.gc_probalility = 1000,就是100%的概率,也就说每次session_start()都会触发gc进程
   

标签:session,文件,name,Session,gc,运行机制,cookie,id
From: https://www.cnblogs.com/eminer/p/18390064

相关文章

  • python接口自动化——接口登录获取session、cookie
    【参考】方法一参考链接如下,直接获取返回的cookie失败,拿到的cookies是空。(因为登录的url返回用f12看着是空的,用Charles才能看到,进行了重定向,返回了重定向的url)https://baijiahao.baidu.com/s?id=1781328761925882355&wfr=spider&for=pc 方法二参考链接如下,去拿session,再使用s......
  • 使用Flask快速构建Web后端项目:Python、Flask、Mysql、Migrate、SQLAlchemy、Login、Se
    Flask是一个用Python编写的轻量级Web应用框架。它设计简单且易于扩展,如果与Jinja2模板引擎和WerkzeugWSGI工具集结合使用,Flask可以用来快速开发小型到中型的网站。Flask鼓励快速开发和简洁的代码,同时保持了扩展性和灵活性。本文旨在如何使用Flask及其相关组件快......
  • localStorage、sessionStorage 和 cookies
    localStorage、sessionStorage和cookies都是用于在浏览器中存储数据的方式。localStorage用途:用于存储较大、较长期的数据,数据不会随浏览器关闭而消失,适合存储长期有效的信息,如用户设置、主题偏好等。•存储大小:大约5 MB左右。•有效期:数据会一直保留,直到用户......
  • SparkContext与SparkSession区别
    文章目录pyspark初始化SparkContextSparkSessionSparkConfspark-submitpyspark初始化SparkContextSpark中的主要接口,代表与Spark集群的连接。在早期版本的Spark中,需要通过SparkContext对象来初始化Spark应用程序。在Spark2.0之后,推荐使用SparkSession来替代。创......
  • localStorage、sessionStorage、Cookie的区别以及特点
    文章目录一、localStorage、sessionStorage、Cookie是什么?二、各自特点以及之间的区别1.`window.localStorage`2.`sessionStorage`3.`Cookie`三、写一个html页面以用来测试这三者不同的区别四、开始测试测试`localStorage`:测试`sessionStorage`:测试`Cookie`:总......
  • Cookie,Session Filter,Listener详解
    HTTP请求的无状态性HTTP的无状态性是其一个重要的特征,指的是HTTP协议本身并不保留客户端与服务器交互的历史信息,换而言之,即每次的HTTP请求都是独立的,服务器在处理每一个请求时都不会记住前一个请求的状态无状态的含义独立性:每次的HTTP请求都是独立的,不依赖于之前的请......
  • Oracle sys.dba_audit_session查询慢
    备注:Oracle 11.2.0.4一.问题描述从awr报告可以看到这个EM相关的sql消耗了大量的IO。也可以通过消耗IO的sql来查找:--找出消耗物理IO资源最大的的SQL语句selectdisk_reads,substr(sql_text,1,4000)fromv$sqlareaorderbydisk_readsdesc;具体的慢SQL如下:SELECT......
  • Session
    Startup.cs文件中进行配置publicvoidConfigureServices(IServiceCollectionservices){services.AddDistributedMemoryCache();//使用内存作为缓存存储Sessionservices.AddSession(options=>{options.IdleTimeout=TimeSpan.FromMinutes(30);/......
  • Cookie和Session的区别
    Cookie:Cookie是保存在客户端的一小块文本串的数据。客户端向服务器发起请求时,服务端会向客户端发送一个Cookie,客户端就把Cookie保存起来。在客户端下次向同一服务器再发起请求时,Cookie被携带发送到服务器。服务端可以根据这个Cookie判断用户的身份和状态。Session:Sessi......
  • session概念和底层原理——生命周期
    session–(会话)一、概念session在网络应用中称为“会话控制”,是服务器为了保存用户状态而创建的一个特殊的对象。简而言之,session就是一个对象,用于存储信息。二、使用和注意事项session是以键值对的形式存放数据,类型为**<String,Object>**,通过getAttribute()和setAttri......