今天用tp框架做一个登陆界面的时候,对于session的过期时间这个问题表费解,例如如何设置一个准确的session过期时间。
通过自己看tp的官方文档,里面只提到了两个,但是这两个一个是session.gc_maxlifetime ,一个是cookie.session_lifetime。但是:
1、session.gc_maxlifetime:session.gc_maxlifetime specifies the number of seconds after which data will be seen as 'garbage' and cleaned up. Garbage collection occurs during session start.(session.gc_maxlifetime指定数据在多少秒之后将被视为垃圾并清理掉。 垃圾收集发生在会话开始时。)
垃圾收集器仅以session.gc_probability除以session.gc_divisor的概率开始。使用这些选项的默认值(分别为1和100),机会仅为1%。那么,你可以简单地调整这些值,以便更频繁地启动垃圾收集器。但是当垃圾回收器启动时,它会检查每个注册会话的有效性。这是成本密集型的。此外,当使用PHP的默认session.save_handler文件时,会话数据将存储在session.save_path中指定的路径中的文件中。使用该会话处理程序,会话数据的年龄根据文件的上次修改日期而不是上次访问日期进行计算:这里举一个例子:假设我5分钟前设置了一个session_a=1的Session变量, 5分钟后又设置了一个session_b=2的Seesion变量, 那么这个Session文件的修改时间为添加session_b时刻的时间, 那么session_a就不能在30分钟的时候, 被清理了。
2、session.cookie_lifetime :session.cookie_lifetime以秒为单位指定发送给浏览器的cookie的生命周期。
这个过期只是Cookie过期, 换个说法这点就考察Cookie和Session的区别, Session过期是服务器过期, 而Cookie过期是客户端(浏览器)来保证的, 即使你设置了Cookie过期, 这个只能保证标准浏览器到期的时候, 不会发送这个Cookie(包含着Session ID), 而如果通过构造请求, 还是可以使用这个Session ID的值。
如果不使用数据库来记录session的过期时间,仅仅使用php,那么我们可以自己设置一个会话过期时间,在设置session的时候手动添加一个$_ SESSION['create_time']来记录这个会话创建的时间。然后通过判断这个create_time的时间戳与当前的时间戳的大小,确定这个session是否过期,如果过期手动删除session,然后提示用户重新进行登陆。
示例代码如下:
if (!isset($_SESSION['CREATED'])) {
$_SESSION['CREATED'] = time();
} else if (time() - $_SESSION['CREATED'] > 1800) {
// 会话开始的时间超过30分钟
session_regenerate_id(true); // 使用新生成的会话 ID 更新现有会话 ID
$_SESSION['CREATED'] = time(); // 更新会话创建的时间
// or 提示用户重新登陆
}
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
// last request was more than 30 minutes ago
session_unset(); // unset $_SESSION variable for the run-time
session_destroy(); // destroy session data in storage
//跳转页面让用户进行登陆
}
如果使用数据库的话,这里以mysql为例,可以在mysql的user表中添加一个记录创建会话的时间,然后每次将这个user表中的这个时间取出来和当前的时间进行比较,判断会话是否过期。(ps:使用mysql的话速度慢,读取很耗费资源,所以建议使用缓存数据库。例如memcache、redis等等)