session的学习笔记 —— 将session写入数据库

袁志蒙 3044次浏览

摘要:学习了一天,写了一个session类,将session写入数据库,方便以后用,记录一下...

学习了一天,写了一个session类,将session写入数据库,方便以后用,记录一下


代码分享:

<?php
/*
* 说明:
* 数据库为mysql,
* 数据库名为session,表名为session,
* 表中字段包括PHPSESSID,update_time,client_ip,data
* 版权所有:(c) 2014-2016 https://www.yzmcms.com All rights reserved.
*/

class session{
	private static $handler = null;
	private static $ip = null;
	private static $lifetime = null;
	private static $time = null;
	
	//配置静态变量
	private static function init($handler){
		self::$handler = $handler;        //获取数据库资源
		self::$ip = !empty($_SERVER["REMOTE_ADDR"])? $_SERVER["REMOTE_ADDR"]:'unkonw';        //获取客户端ip
		self::$lifetime = ini_get('session.gc_maxlifetime');        //获取session生命周期
		self::$time = time();        //获取当前时间
	}
	
	//调用session_set_save_handler()函数并开启session
	static function start($pdo){
		self::init($pdo);
		session_set_save_handler(
			array(__CLASS__,'open'),
			array(__CLASS__,'close'),
			array(__CLASS__,'read'),
			array(__CLASS__,'write'),
			array(__CLASS__,'destroy'),
			array(__CLASS__,'gc')
		);
		session_start();
	}
	
	public static function open($path,$name){
		return true;
	}
	
	public static function close(){
		return true;
	}
	
	//查询数据库中的数据
	public static function read($PHPSESSID){
		 $sql = "select PHPSESSID,update_time,client_ip,data from session where PHPSESSID=?";
		 $stmt = self::$handler->prepare($sql);
		 $stmt->execute(array($PHPSESSID));
		 if(!$result = $stmt->fetch(PDO::FETCH_ASSOC)){
			 return '';
		 }
		 if(self::$ip != $result['client_ip']){
			 self::destroy($PHPSESSID);
			 return '';
		 }
		 if(($result['update_time']+self::$lifetime)<self::$time){
			 self::destroy($PHPSESSID);
			 return '';
		 }
		 return $result['data'];
	}
	
	/*
	 *首先查询该session是否存在数据,如果存在,则更新数据,如果不存在,则插入数据
	 *将session写入数据库中,$data传入session中的keys和values数组
	 */
	public static function write($PHPSESSID,$data){
		$sql = "select PHPSESSID,update_time,client_ip,data from session where PHPSESSID=?";
		 $stmt = self::$handler->prepare($sql);
		 $stmt->execute(array($PHPSESSID));
		 
		 if($result=$stmt->fetch(PDO::FETCH_ASSOC)){                
			 if($result['data'] != $data || self::$time > ($result['update_time']+30)){
				 $sql = "update session set update_time=?,data=? where PHPSESSID = ?";
				 $stmt = self::$handler->prepare($sql);
				 $stmt->execute(array($self::$time,$data,$PHPSESSID));
			}
		 }else{
			 if(!empty($data)){
				 try{
					 $sql = "insert into session(PHPSESSID,update_time,client_ip,data) values(?,?,?,?)";
				 }catch(PDOException $e){
					 echo $e->getMessage();
				 }
				 $sth = self::$handler->prepare($sql);
				 $sth->execute(array($PHPSESSID,self::$time,self::$ip,$data));
			 }
		 }
		 return true;
	}
	
	public static function destroy($PHPSESSID){
		$sql = "delete from session where PHPSESSID = ?";
		$stmt = self::$handler->prepare($sql);
		$stmt->execute(array($PHPSESSID));
		return true;
	}
	
	public static function gc($lifetime){
		$sql = "delete from session where update_time<?";
		$stmt = self::$handler->prepare($sql);
		$stmt->execute(array(self::$time-$lifetime));
		return true;
	}
}

//使用PDO连接数据库
try{
	$pdo = new PDO("mysql:host=localhost;dbname=session","root","root");
}catch(PDOException $e){
	echo $e->getMessage();
}

//开启session
session::start($pdo);
随机内容

表情

共1条评论
  • 网友评论:

    试试功能,抢沙发

    2016-12-20 15:23:47 回复

    点击加载