如何保证session不提前销毁,而是按时彻底销毁

session使用中常见的两大问题:

  1. 用着用着,突然session过期了,值为空
  2. 希望彻底注销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不提前销毁,而是按时彻底销毁的需求。欢迎大家对此提出自己的看法,本文会持续更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值