站在服务器的角度来说,session是为了区分一个个的浏览器.需要浏览器的cookie配合.
拿web页面用户登陆时的情况举例.
1.用户 提供账号密码,发送到 服务器.
2.服务器接收账号密码,与数据库进行匹配,匹配成功则证明是合法用户.
3.服务器生成一个SESSION文件,并在里边写入一些内容,
session文件
命名通常是sess_随机字符串
,如下是服务端的session文件
:
4.服务器把随机字符串返回给浏览器,一般存在
浏览器的cookie
中.如下图: 图片.png
5.浏览器下次请求会带上cookie中的
PHPSESSID(也就是上边那个字符串)
,服务器根据提交过来的字符串去寻找对应的session文件
.能找到就说明这个浏览器是登陆过的,找不到就跳转到登陆页面.
如果浏览器把cookie清空了,那服务器根本不知道去找哪个文件,所以只能跳到登陆页面让你重新登陆.
这就又产生了新的问题.
服务器上大量的SESSION文件如何处理
每个用户访问,都会在服务器生成一个SESSION文件,用户量大的时候会有好多好多个文件,当用户关闭浏览器或者SESSION到期失效后,这些过期的文件该怎么办呢?
PHP的处理方式是,定义一个过期回收机制 ,用来清理这些过期的SESSION文件.暂且把这个回收机制称为清理事件
.
关于配置,在php.ini
中,主要有这几个参数:
session.gc_probability
-触发清理事件的分子
(默认1)
session.gc_divisor
-触发清理事件的分母
(默认1000)
默认配置的参数是:分子/分母 = 1/1000
时.表示,每次访问会有千分之一
的概率触发清理事件
.系统会扫描所有的SESSION文件,过期的删除,未过期的忽略.
如果改成1/1则每次请求都会触发清理事件
,但是这样做很明显会消耗更多的服务器资源.不建议.
那什么样的文件算是过期呢?
在php.ini里还有一个参数session.gc_maxlifetime
默认是1440秒(24分钟),也就是说一个SESSION文件,超过24分钟没有被读写,则认为过期,清理事件
触发时则会删除这个文件.
但有一种可能是SESSION文件已经超过24分钟,此时清理事件
还没有被触发,那么这个文件虽然过期了,但是仍然可以正常访问,这就是为什么我们在程序里设置expire
没有效果的原因.
其他的以后在补充吧.有说错的地方欢迎指正.
网友评论