session使用中常见的两大问题:
- 用着用着,突然session过期了,值为空
- 希望彻底注销session,有时并不一定能立刻注销掉
为解决这两个问题,这里给出一个有效的方式,即基于(php.ini修改与人工设置检验$_SESSION[‘last_time’])的解决方案。
第一步、修改php.ini中的session.gc_maxlifetime、session.gc_divisor、session.gc_probability值
session.gc_maxlifetime = 14400
- session的生存时间,即该session文件在生成后4小时后,则被视为垃圾文件,等待gc(garbage collocation)垃圾回收。这里综合考虑服务器性能问题,在用户量适中时,将默认值1440(24分钟)改为14400(4小时)
session.gc_divisor = 1000
session.gc_probability = 1
- session垃圾回收概率的分母,与可以理解为session_start()运行多少次后执行一次垃圾回收,这里先保持默认值1000与1
- 注:如果使用Appserv等发布工具,修改php.ini后需要重启工具的服务
第二步、在生成系统需要使用的session值时,生成$_SESSION[‘last_time’]
一个工作时间一直保持,其他时间10分钟断开一次,代码如下:
//当前时间
$hour = date("H");
//during the morning
if($hour < 12 && $hour > 6)
{
$_SESSION['last_time'] = strtotime("12:00:00");
//during the afternoon
}elseif($hour < 18 && $hour > 13){
$_SESSION['last_time'] = strtotime("18:00:00");
//other time
}else{
$_SESSION['last_time'] = time() + 60 * 10;
}
检验代码如下:
if(!empty($_SESSION['last_time']))
{
if($_SESSION['last_time'] > time())
{
//session超时,但未被清空,手工执行清空
//$_SESSION = array(); //这个大家一直在用,但不确定其是否有意义,之后将更新这里
session_unset(); //释放内存中的session,但不删除session文件与sessionid
session_destroy(); //删除session文件与sessionid,但不释放内存中的session
//执行业务代码
}else{
//session在有效期内,执行业务代码
}
}else{
//session超时,且被清空,未以防万一,再次清空一次
//$_SESSION = array(); //这个大家一直在用,但不确定其是否有意义,之后将更新这里
session_unset(); //释放内存中的session,但不删除session文件与sessionid
session_destroy(); //删除session文件与sessionid,但不释放内存中的session
//执行业务代码
}
- 注:这段代码前方都需要有session_start(),开启session
至此,则实现了session不提前销毁,而是按时彻底销毁的需求。欢迎大家对此提出自己的看法,本文会持续更新。