PHP中的session机制详解
Session是什么?
⾸先,我们⼤概知道session是浏览器与服务器之间的⼀次交互会话。
那么会话⼜是什么呢?顾名思义就是浏览器与服务器之间的对话,浏览器⼀关闭,会话就结束了。
说session不得不说的就是HTTP协议和cookie了
我们都知道http协议是⼀个⽆状态的协议,就是说本次请求和上次请求没有任何关系。这就会带了⼀个问题,如果请求的页⾯有关联,⽐如登录后访问⾸页,那么在⾸页怎么判
断是登录状态呢?
所以此时cookie就出现了,cookie是把少量的信息存储在⽤户⾃⼰的浏览器上,当⽤户⽤浏览器访问服务器时,PHP就可以读取cookie中的信息,在任何页⾯中都可以使⽤。
但是cookie存在缺陷,cookie存储在客户端,存储⼤⼩有限制,⼀个域名下存储个数也有限制,最关键的是⽤户是可见的,不安全,⽤户可以修改甚⾄禁⽤cookie
这个时候session就出现了,session存储在服务器端,不⽤每次请求客户端都随⾝携带cookie
所以:session的作⽤就是:解决HTTP协议请求的⽆状态问题,让多次的HTTP请求产⽣联系
Session的运⾏机制
我们要使⽤session,第⼀步就是开启session,这也是session的第⼀阶段:
session_start() 阶段
这个函数的作⽤就是开启session,开启之后读取cookie信息判断是否存在session_id,如果存在就是⽤这个session_id,如果没有就会随机⽣成⼀个唯⼀的32位的session_id。
通过这个session_id就可以绑定⼀个唯⼀的⽤户。
这个过程还会初始化$SESSION这个变量,读取session⽂件中的内容,把内容反序列化之后赋值到$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如何设置和读取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.serialize_handler = php
<_divisor = 1000
<_probability = 1
<_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⾃动删除垃圾⽂件:
<_divisor = 1000
<_probability = 1
<_maxlifetime = 1440 #设置session⽂件的过期时间
删除session垃圾⽂件的概率是,__divisor=1/1000,也就是说每次session_start()都会有1/1000的概率触发gc进程,但是1000次中必会有⼀次,如果_probalility = 1000,就是100%的概率,也就说每次sess
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论