深入理解session过期机制

kennethkenneth 发布于 2012/07/01 12:54
阅读 11K+
收藏 17
PHP
首先得明白:session的过期时间由两方面决定的;
1存储在客户端的$_COOKIE['PHPSESSID']的过期时间(默认cookie名称为PHPSESSID,可通过php.ini中的session.name修改。)
2.存储在服务器端的相对应的session文件(session文件名和上述cookie的值一一对应),默认为1440秒,即24分钟

ok,现在详细阐述上述两者的关系: 当执行session_start()的时候,其实是做了两件事: 1,检查客户端发送过来的的所有cookie(当然也包括$_COOKIE['PHPSESSID'], 如果有的话),根据$_COOKIE['PHPSESSID']的值(这是由apache产生的随机字符串,如0lkbd2se458r600m2m7o1r4ic5)来访问 相对应的 session文件(如:sess_0lkbd2se458r600m2m7o1r4ic5,我的默认存储在‘E:\wamp\tmp’下),这两者是一 一对应的关系。打个比喻:$_COOKIE['PHPSESSID']就是一把开启宝盒的钥匙,而那个宝盒就是session文件,里面存储着用户的重要 信息,也就是session的值, 如:$_SESSION['uid']=1,$_SESSION['username']='name',$_SESSION['pwd']='pwd', 当然文件里面的值是经过序列化的。 2,如果客户端没有传来$_COOKIE['PHPSESSID'],就会有服务端产生一个随机的$_COOKIE['PHPSESSID']并存储在客户端。

明白上面这些,我们可以通过下面的方法修改session的过期时间:
1.session_set_cookie_params('50');//修改$_COOKIE['PHPSESSID'],的生存时间为50秒

(或者可以这样: setcookie(session_name(),session_id(),time()+50);)

2.ini_set('session.gc_maxlifetime','50');//设置session文件的有效时间为50秒

但是,可能有些朋友会做这样 一个试验, 在50秒内获取$_COOKIE['PHPSESSID']的值并记录下来(如黑客截获这个cookie),这样等50秒过后发现原先 的$_COOKIE['PHPSESSID']值确实不存在了,而出现了一个新的$_COOKIE['PHPSESSID'],但是‘E:\wamp \tmp’下的旧session文件却没有消失(默认只有1/1000的概率会消失,应该不会碰到吧,呵呵),这是为什么呢?我不是已经设置了 .ini_set('session.gc_maxlifetime','50');了 吗?再做一个实验:这时你伪造一个$_COOKIE['PHPSESSID'],值为刚才你记录下的,神奇的事发生了,你依然可以访问刚才旧的 session文件!!!(虽然他已经过期),只要这个文件没被删除,用相对应得$_COOKIE['PHPSESSID']依然可以进行访问!!!

那我们设置ini_set('session.gc_maxlifetime', '50');还有什么意义呢?这就涉及的GC(GarbageCollector)的回收机制。
默 认情况下,session.gc_probability = 1,session.gc_divisor=1000,也就是说有1/1000的可能性会启动GC。GC的工作,就是扫描所有的session信息,用当 前时间减去session的最后修改时间(modifieddate),同session.gc_maxlifetime参数进行比较,如果生存时间已经 超过gc_maxlifetime,就把该session删除。只要没有启动GC,即使session过期,也仍旧可通过相对应 得$_COOKIE['PHPSESSID']进行访问!
  
原文参考: http://www.jb51.net/article/26890.htm
                 http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2012/0621/10583.html
加载中
0
霸气千秋
霸气千秋
亲,难道就只会复制么,不能整理下
0
k
kennethkenneth

引用来自“霸气千秋”的答案

亲,难道就只会复制么,不能整理下
上面都是自己一个字一个字敲出来的。。。
0
王昊然
王昊然

2. 自己为每一个Session值增加Time stamp.

3. 每次访问之前, 判断时间戳.

也就是说,在实际应用过程中,例如我存储一个SESSION值,都要增加一个时间戳吗?

 

$_SESSION['id']='1_'.time();

之后使用的时候,再到程序里判断这个时间戳过没过期?是不是这个意思

0
k
kennethkenneth

引用来自“王昊然”的答案

2. 自己为每一个Session值增加Time stamp.

3. 每次访问之前, 判断时间戳.

也就是说,在实际应用过程中,例如我存储一个SESSION值,都要增加一个时间戳吗?

 

$_SESSION['id']='1_'.time();

之后使用的时候,再到程序里判断这个时间戳过没过期?是不是这个意思

这个原文中有提到,不过我觉得好像有点问题,所以没写出来。

如果每个用户时访问时都去遍历存储session的文件夹,然后把其中过期的文件删除,对性能到底有多大影响。不如再写个程序,这个程序完全由管理员控制(shell能实现吗?我不懂shell。。),定期的清理过期session文件,原理也很简单,就是遍历文件嘛

0
王昊然
王昊然

引用来自“kennethkenneth”的答案

引用来自“王昊然”的答案

2. 自己为每一个Session值增加Time stamp.

3. 每次访问之前, 判断时间戳.

也就是说,在实际应用过程中,例如我存储一个SESSION值,都要增加一个时间戳吗?

 

$_SESSION['id']='1_'.time();

之后使用的时候,再到程序里判断这个时间戳过没过期?是不是这个意思

这个原文中有提到,不过我觉得好像有点问题,所以没写出来。

如果每个用户时访问时都去遍历存储session的文件夹,然后把其中过期的文件删除,对性能到底有多大影响。不如再写个程序,这个程序完全由管理员控制(shell能实现吗?我不懂shell。。),定期的清理过期session文件,原理也很简单,就是遍历文件嘛

如果你再写一个程序,还是做不到像http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2012/0621/10583.html  这里说的“严格”的过期吧。

鸟哥给出的解决方案,应该就是我说的这个意思吧

0
k
kennethkenneth

引用来自“王昊然”的答案

引用来自“kennethkenneth”的答案

引用来自“王昊然”的答案

2. 自己为每一个Session值增加Time stamp.

3. 每次访问之前, 判断时间戳.

也就是说,在实际应用过程中,例如我存储一个SESSION值,都要增加一个时间戳吗?

 

$_SESSION['id']='1_'.time();

之后使用的时候,再到程序里判断这个时间戳过没过期?是不是这个意思

这个原文中有提到,不过我觉得好像有点问题,所以没写出来。

如果每个用户时访问时都去遍历存储session的文件夹,然后把其中过期的文件删除,对性能到底有多大影响。不如再写个程序,这个程序完全由管理员控制(shell能实现吗?我不懂shell。。),定期的清理过期session文件,原理也很简单,就是遍历文件嘛

如果你再写一个程序,还是做不到像http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2012/0621/10583.html  这里说的“严格”的过期吧。

鸟哥给出的解决方案,应该就是我说的这个意思吧

嗯 真做不到。服务器的session文件还是做不到过期了就删除。。鸟哥给出的解决方案时?
0
王昊然
王昊然

引用来自“kennethkenneth”的答案

引用来自“王昊然”的答案

引用来自“kennethkenneth”的答案

引用来自“王昊然”的答案

2. 自己为每一个Session值增加Time stamp.

3. 每次访问之前, 判断时间戳.

也就是说,在实际应用过程中,例如我存储一个SESSION值,都要增加一个时间戳吗?

 

$_SESSION['id']='1_'.time();

之后使用的时候,再到程序里判断这个时间戳过没过期?是不是这个意思

这个原文中有提到,不过我觉得好像有点问题,所以没写出来。

如果每个用户时访问时都去遍历存储session的文件夹,然后把其中过期的文件删除,对性能到底有多大影响。不如再写个程序,这个程序完全由管理员控制(shell能实现吗?我不懂shell。。),定期的清理过期session文件,原理也很简单,就是遍历文件嘛

如果你再写一个程序,还是做不到像http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2012/0621/10583.html  这里说的“严格”的过期吧。

鸟哥给出的解决方案,应该就是我说的这个意思吧

嗯 真做不到。服务器的session文件还是做不到过期了就删除。。鸟哥给出的解决方案时?

就是这篇帖子的最后面:http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2012/0621/10583.html

1. 设置Cookie过期时间30分钟, 并设置Session的lifetime也为30分钟.

2. 自己为每一个Session值增加Time stamp.

3. 每次访问之前, 判断时间戳.

 

他的思路就是,我做不到过期就删除文件,所以我在程序里判断,只要过期就失效

0
xiaofanku
xiaofanku

【设置一个严格30分钟过期的Session】这篇文件写的我也理解不了“自己为每一个Session值增加Time stamp”这是什么意思。希望作者指点一二

返回顶部
顶部