欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

session 类 数据库交互

程序员文章站 2022-05-01 16:59:19
...
跳至
query("update ".self::$table." set value='$session_data', expiry='$session_expire' where session_id='$session_id'");
			self::close();
		}
		self::$is_del = TRUE;
	}
	/**
	 * 销毁
	 * 
	 * */
	public static function destroy() 
	{
		$session_id			= self::get_session_id();
		$_COOKIE['WBSID']	= '';
		
		self::open();
		self::$dbo->query("delete from ".self::$table." where session_id='$session_id'");
		self::close();
	}
	
	
	/**
	 * 读取  私有
	 * */
	private static function read()
	{
		$session_id = self::$session_id;
		if (!$session_id) {
			$session_id = self::get_session_id();
		}
		
		if (!$session_id) return array();
		
		$user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? md5($_SERVER['HTTP_USER_AGENT']) : '';
		$client_ip	= Fun::getIp();
		$session_expire = TIME - self::get_gc_maxtime();
		
		$rs = self::$dbo->fetchRow("select session_id, value, agent, ip from ".self::$table."
			where session_id='$session_id' and expiry>'$session_expire'");
		
		if (!$rs || $rs['agent'] != $user_agent || $rs['ip'] != $client_ip) 
		{
			return FALSE;
		}
		
		self::$session_id = $rs['session_id'];
		return unserialize($rs['value']);
	}
	/**
	 * session 写入   私有
	 * */
	private static function write(array $session_data) 
	{
		$session_id = self::$session_id;
		
		if (!$session_id)
		{
			$session_id = self::get_session_id();
		}
		
		$session_expire = TIME + self::get_gc_maxtime();
		
		$user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? md5($_SERVER['HTTP_USER_AGENT']) : '';
		$client_ip 	= Fun::getIp();
		
		$session_data = serialize($session_data);
		
		if (self::$session_id && self::$session_id === $session_id) 
		{
			self::$dbo->query("update ".self::$table." set value='$session_data', expiry='$session_expire', agent='$user_agent', ip='$client_ip' where session_id='$session_id'");
		} 
		else 
		{
			self::$session_id = $session_id = self::create_session_id();
			self::$dbo->query("insert into ".self::$table."(session_id, value, expiry, agent, ip) 
				values('$session_id', '$session_data', '$session_expire', '$user_agent', '$client_ip')");
		}
		return true;
	}
	/**
	 * session 更新   私有
	 * */
	private static function update() 
	{
		if (!self::$is_update) 
		{
			$session_id = self::$session_id;
			$session_expire = TIME + self::get_gc_maxtime();
			self::$dbo->query("update ".self::$table." set expiry='$session_expire' where session_id='$session_id'");
		}
		self::$is_update = TRUE;
	}
	
	private static function close() 
	{
		if (!self::$is_gc && mt_rand(1, self::$gc_rate_de)%self::$gc_rate_co == 0) 
		{
			self::gc();
		}
		self::$is_gc = TRUE;
	}
	/**
	 * 过期session 清除  随机触发
	 * */
	private static function gc() 
	{
		
		$session_expire = TIME - self::get_gc_maxtime();
		 self::$dbo->query("delete from ".self::$table." where expiry<'$session_expire'");
	}
	
	private static function get_session_id() 
	{
		if (isset($_COOKIE['WBSID']) && strlen($_COOKIE['WBSID'])==32) 
		{
			$sid = $_COOKIE['WBSID'];
			setcookie('WBSID', $sid, TIME + self::get_gc_maxtime(), self::$path, self::$domain, self::$secure, self::$httponly);
			return $sid;
		}
		return null;
	}
	
	private static function create_session_id() 
	{
		$sid = self::get_session_id();
		if (!$sid) 
		{
			$sid = Fun::getIp() . TIME . microtime(TRUE) . mt_rand(mt_rand(0, 100), mt_rand(100000, 90000000));
			$sid = md5(self::$pre_key . $sid);
			setcookie('WBSID', substr($sid, 0, 32), TIME + self::get_gc_maxtime(), self::$path, self::$domain, self::$secure, self::$httponly);
		}
		return $sid;
	}
	
	public static function get_gc_maxtime()
	{
		return  self::$gc_max_time;
	}
}