phpsession_id⽣成规则,php中Session的⽣成机制、回收机制
和存储机制探究
1、php中session的⽣成机制
我们先来分析⼀下PHP中是怎么⽣成⼀个session的。设计出session的⽬的是保持每⼀个⽤户的各种状态来弥补HTTP协议的不⾜(⽆状态)。我们现在有⼀个疑问,我们都知道session是保存在服务器的,既然它⽤于保持每⼀个⽤户的状态那它利⽤什么来区别⽤户的呢?这个时候就得借助cookie了。当我们在代码中调⽤session_start();时,PHP会同时往SESSION的存放⽬录(默认为/tmp/)和客户端的cookie ⽬录各⽣成⼀个⽂件。session⽂件名称像这样:
格式为sess_{SESSIONID} ,这时session⽂件中没有任何内容,当我们在session_start();添加了这两⾏代码:
$_SESSION['name'] = 'wanchun0222';
$_SESSION['blog'] = 'coderbolg';
这时⽂件就有内容了:
name|s:11:"wanchun0222";blog|s:13:"coderbolg";
这时再看看cookie:
可以看到服务器为我们⾃动⽣成了⼀个cookie,cookie名称为"PHPSESSID",cookie内容是⼀串字符,其实这串字符就是{SESSIONID}。也许你已经明⽩了,当我们使⽤session时,PHP就先⽣成⼀个唯⼀的SESSIONID号(如2bd170b3f86523f1b1b60b55ffde0f66),再在我们服务器的默认⽬录下⽣成⼀个⽂件,⽂件名为sess_{SESSIONID},同时在当前⽤户的客户端⽣成⼀个cookie,内容已经说过了。这样PHP会为每⼀个⽤户⽣成⼀个SESSIONID,也就是说⼀个⽤户⼀个session⽂件。PHP第⼀次为某个⽤户使⽤session时就向客户端写⼊了cookie,当这个⽤户以后访问时,浏览器会带上这个cookie,PH
P在拿到cookie后就读出⾥⾯的SESSIONID,拿着这个SESSIONID去session⽬录下session⽂件。到后在调⽤$_SESSION['blog']的时候显⽰出来。
2、php中session的过期回收机制
我们明⽩了session的⽣成及⼯作原理,发现在session⽬录下会有许多session⽂件。当然这些⽂件⼀定不是永远存在的,PHP⼀定提供了⼀种过期回收机制。在php.ini中_maxlifetime为session设置了⽣存时间(默认为1440s)。如果session⽂件的最后更新时间到现在超过了⽣存时间,这个session⽂件就被认为是过期的了。在下⼀次session回收的时候就会被删除。那下⼀次session回收是在什么时候呢?这和php请求次数有关的。在PHP内部机制中,当php被请求了N次后就会有⼀次触发回收机制。到底是请求多少次触发⼀次是通过以下两个参数控制的:
<_probability = 1
<_divisor = 100
session如何设置和读取这是php.ini的默认设置,意思是每100次PHP请求就有⼀次回收发⽣。概率是 gc_probability/gc_divisor 。我们了解了服务器端的session过期机制,再来看看客户端的cookie的过期机制。
如果cookie失效了浏览器⾃然发送不了cookie到服务器,这时即使服务器的session⽂件存在也没⽤,因为PHP不知道要读取哪个session ⽂件。我们知道PHP的cookie过期时间是在创建时设置的,那么PHP在创建session的同时为客户端创建的cookie的⽣命周期是多久呢?这个在php.ini中有设置:kie_lifetime 。这个值默认是0,代表浏览器⼀关闭SESSIONID就失效。那就是说我们把
<_maxlifetime和kie_lifetime设置成同⼀个值就可以控制session的失效时间了。
3、php中session的客户端存储机制
由上⾯的介绍我们可以知道,如果⽤户关闭了cookie,那我们的session就完全没法⼯作了。是的,确实是这样。php中session的客户端存储机制只有cookie吗?不是的。既然我们的SESSIONID 不能通过cookie传递到各个页⾯,那我们还有另⼀个法宝,就是通过页⾯GET传值的⽅式。
PHP可以在cookie被禁⽤时⾃动通过GET⽅式跨页传递SESSIONID,前提是设置php.ini的session.use_trans_sid为1。这时当我们在客户端禁⽤了cookie时使⽤了session,并在当前页⾯通过点击链接到另⼀页⾯时,PHP会⾃动在链接上添加SESSIONID参数,像这样:nextpage.php?SESSIONID=2bd170b3f86523f1b1b60b55ffde0f66。我想你应该看到了这种⽅式的缺点:好像不够安全啊。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论