关于 Session Time Out 的时间控制总结

from:http://weblog.kreny.com/2007/06/_php_session_time_out.html
关于 Session Time Out 的时间控制,这里稍微总结一下,做个纪录。

php.ini 的关于 Session 的设置
① 是否要 cache ? ==> NO!
在 http 的 header 里面输出一些关于 session 的 cache(??对具体定义不是很清除) ,虽然这个和 Session 的 time out 没有什么直接的联系,但从历来的经验来讲,会出现一些很奇怪的现象,所以这里统一将 cache 关闭,使得 header 里面不出现 session 的信息。

; Set to to determine HTTP caching aspects
; or leave this empty to avoid sending anti-caching headers.
session.cache_limiter = nocache

; Document expires after n minutes.
session.cache_expire = 180

② 关于 garbage

; Define the probability that the 'garbage collection' process is started
; on every session initialization.
; The probability is calculated by using gc_probability/gc_divisor,
; e.g. 1/100 means there is a 1% chance that the GC process starts
; on each request.

session.gc_probability = 1
session.gc_divisor = 100

; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
session.gc_maxlifetime = 1440


这个设置是指:在 1440 秒后, Session 会被认作是 garbage (垃圾),而针对这些 garbage ,在每次连接(request),有 1/100 的几率(下文称为“清除几率”)来清除这些 garbage--当然,可以认为在 1440 秒后,平均通过进行 100 次的连接就会将 garbage session清除。
如果将以上的分子和分母都调整到 1, 那所有的 garbage session 将会在期限(session.gc_maxlifetime)过后的第一次 request 的时候被清除。但是这会大大加大对服务器的负荷,不建议使用。


③最后设置 session.cookie_lifetime

; Whether to use cookies.
session.use_cookies = 1

; Lifetime in seconds of cookie or, if 0, until browser is restarted.
; session.cookie_lifetime 以秒数指定了发送到浏览器的 cookie 的生命周期。
; 值为 0 表示“直到关闭浏览器”。默认为 0。
session.cookie_lifetime = 0


如果使用 cookie 在客户端保存 session 信息,这里可以设置 cookie 的有效时间。自己的理解是,在客户端的 cookie 里面保存有 Session ID,用来比较其有效期限。
现在做的项目使用 cookie 来保存用户信息,每当 session.cookie_lifetime 设置为 0 的时候,理所当然 IE 被关闭后每次都要重新登陆。但是当将此设置为一定的值后,在指定的秒数内重新打开该页面,仍旧保留以前的 cookie 数据并且自动登陆。


留意点:
session.cookie_lifetime 设定为一个值 (例如 1000 秒)后,相应的 session.gc_maxlifetime 也需要设置为 1000 ,才能方便清除?
因为测试过几次,将 session.cookie_lifetime 设置为较小的数值(例如 100秒)的时候,即使将“清除几率”变为 100% , 也不能在这个较小数值的时间内将 session 清除。因此怀疑是 session.gc_maxlifetime 设置了较大的一个值,使得系统需要更多的时间将 session 认定为 garbage, 即使这个 session 实质上已经过了它的 lifetime。 
几经测试,在统一了 session.cookie_lifetime 和 session.gc_maxlifetime 后, session 的定期清除效果比较好。

那么如何有效的限制 Session 的 Time out 呢?以下是两个众所周知的方案,仅作纪录。

将 Timestamp 放入 $_SESSION 中,每次 request 的时候对其值和现在值 now() 进行比较。如果时间间隔没有超出 Time Out 的期限,那么就将现在的时间 now() 赋值给 $_SESSION 中的纪录 timestamp 的部分。
将 timestamp 放入 数据库中,每次 request 的时候对其值和现在值 now() 进行比较。如果时间间隔没有超出 Time Out 的期限,那么就将该用户的 session 纪录进行更新。

======================
你在这个设定中设定了分子项.但是没有设定分母项所以,请除过期的session的机会还是只有预设的1%的机会.
所以你必须要设定你的分母为1,才会是 1/1=100%

<?php
ob_start();
ini_set('session.save_path',"C:\\php\\tmp2"); //设定在存目录
ini_set('session.name', 'pissession'); // session值使用名称
ini_set('session.gc_probability', 1); // 回收处理分子项
ini_set('session.gc_divisor', 1); // 回收处理分母项
ini_set('session.gc_maxlifetime', 15); // 清除以目前时间差中失效的过期sessionini_set('session.cookie_lifetime', 0); // Cookie的SID存在时间
echo $_SESSION['pis'];
if(isset($_SESSION['pis'])){
echo 'gc_maxlifetime = ' . ini_get('session.gc_maxlifetime') . "";
echo 'logined:'.$_SESSION['pis'];
}else{
echo 'timeout';
}
?>

以这样的设定,每一个SESSION在下次开启SESSION_START时100%会去清除.
原文地址:https://www.cnblogs.com/dkblog/p/1980760.html