session.gc_maxlifetime
设置的话,概率是 gc_probability/gc_pisor
;
不明白为什么要这个规定;这个不明白原理
发现 session 会监视用户是否活动,然后会自动更新 session 文件的最后修改时间。
所以写了一个 function 读取 session 文件的最后修改时间,然后跟现在时间对比,如果大于设定的过期时间,假设是 10 分钟。就清空对应 session 的信息。这样可以吗?
有没有更好的方法?
ps:我是指不活动情况下过期时间
ps:我的问题没有考虑到为每个session的值设独立过期时间问题;
用 session.gc_maxlifetime
设置的话,概率是 gc_probability/gc_pisor
;
不明白为什么要这个规定;这个不明白原理
发现 session 会监视用户是否活动,然后会自动更新 session 文件的最后修改时间。
所以写了一个 function 读取 session 文件的最后修改时间,然后跟现在时间对比,如果大于设定的过期时间,假设是 10 分钟。就清空对应 session 的信息。这样可以吗?
有没有更好的方法?
ps:我是指不活动情况下过期时间
ps:我的问题没有考虑到为每个session的值设独立过期时间问题;
推荐你看看 @Laruence 大神的文章 如何设置一个严格30分钟过期的Session
再附另一篇文章: 深入理解PHP原理之Session Gc的一个小概率Notice
PHP中SESSION过期,指的是,超过多少时间不活动,则过期。 如果用户有活动,每次活动时session都会重新write一次。即你说的会自动更新最后的修改时间。 比如,session设置20分钟过期,用户每分钟刷新一次,连续刷新60次,那么一个小时他还是在线的。因为他没有超过20分钟未活动。
看你的说法,你想指定让一个人在指定的时间内过期?即无论他是否活动?到达20分钟即退出?
如果是这样,你设置session.cookie_maxlife = 1200
即可。
因为session的session_id
传递是使用cookie传递的,这样设置后,session_id
在cookie中存活20分钟后过期,再刷新时,服务器会重新分配一个session_id
,他就掉线了。
PS. 这其实也是一个PHP网站中常见的,不愿见的,用户会莫名掉线的问题分析。
设置session handle为memcache或者redis之类,即session的存储介质为nosql数据库,然后在此类介质中存储session值,设定严格的过期时间,这个是最精确的
跟问题没关系。自己封装的session,不用php自带的。莫踩。。