php session机制

  1. 开启会话session,cookies则不须要开启php

  2. session_start()以前不能有任何输出,header()也是如此sql

  3. 这个函数向客户端发一个sessionid保存在cookie中,第一次访问的时候,在服务器建立一个和客户端同名的session文件数组

sessioin_start()
$_SESSION['useranem']='colin'//存储数据

    四、session.name:这个就是SessionID储存的变量名称,多是Cookie,也多是Query_String来传递,默认值                          是“PHPSESSID”; 浏览器

         第二次访问,当浏览器的session_id相同时,服务端不会再次建立新的session文件。
服务器

     五、删除session数据,清空$_SESSION数组就是清空服务器端session文件里面的数据cookie

unset($_SESSION['USERNMAE']);//删除单个数据
$_SESSION=array();//服务端session文件依然存在
session_destory(); // 删除服务端session文件
setCookie(session_name(),"",time()-3600,"/");//删除cookie中的session变量名

    六、session配置   (phpinfo()能够很好的查看全部的配置选项)   能够在php.in中修改session

           session.use_cookies:默认的值是“1”,表明SessionID使用Cookie来传递,反之就是使用Query_String来传递                 session.name:这个就是SessionID储存的变量名称,多是Cookie,也多是Query_String来传递,默认值                                                是“PHPSESSID”; 其值是session_id()函数

           session.cookie_lifetime:这个表明SessionID在客户端Cookie储存的时间,默认是0,表明浏览器一关闭SessionID                                                     就 做废……就是由于这个因此Session不能永久使用! fetch

           session.gc_maxlifetime:Session数据在服务器端储存的时间,若是超过这个时间,那么Session数据就自动删除!              session.auto_start:           是否自动开启sessionui

           session.cookie_path:  '/"   cookie在根目录中储存,特别注意删除cookie时也要删除'/'下的全部cookie

     七、session文件的垃圾回收机制  

ini_set("session.gc_maxlifetime", 15);
ini_set("session.gc_divisor", 10);
ini_set("session.gc_probability", 1);

        当session文件的修改时间超过session.gc_maxlifetime所设定的时间时,session垃圾回收机制并非立刻启动的。           启动session_start() session.gc_divisor次只有session.gc_probability次才会启动session垃圾回收机制的。

  八、自定义session存储机制        

    session_save_handler :file user memeche  修改存储方式 

    session_sava_path:  session文件保存的路径

     session存储是有生命周期的--->打开、关闭、读取、写入、销毁、回收

     注册周期方法: session_set_save_handler("open","close","read","write","destroy","gc");  

ini_set('session.save_handler','user');//php文件中修改,也能够在php.in中修改

       

<?php 

	//注册过程,让php本身处理session时,找这个函数指定的几个周期来完成
class DbSession{
	public static $pdo;				//pdo对象
	public static $ctime;			//当前时间
	public static $maxlifetime;		//最大生存时间
	public static $uip;				//
	public static $uagent;
	public static function start(PDO $pdo){
		self::$pdo=$pdo;
		self::$ctime=time();
		self::$maxlifetime=ini_get("session.gc_maxlifetime");
		self::$uip=!empty($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP']:(!empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR']:$_SERVER['REMOTE_ADDR']);

		//filter_var(self::$uip,FILTER_VALIDATE_IP)&& self::$uip='';

		self::$uagent=!empty($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT']:"";
		session_set_save_handler(array(__CLASS__,"open"),
			array(__CLASS__,"close"),
			array(__CLASS__,"read"),
			array(__CLASS__,"write"),
			array(__CLASS__,"destroy"),
			array(__CLASS__,"gc"));
		 session_start();
	}
	
	//开启时,session_start()
	public static function open($path,$name){
		return true;
	}
	//关闭
	public static function close(){
		return true;
	}
	//读取
	public static function read($sid){
		$sql="select * from session where sid = ?";
		$stmt=self::$pdo->prepare($sql);
		$stmt->execute(array($sid));
		$result=$stmt->fetch(PDO::FETCH_ASSOC);
		//尚未开启session
		if (!$result) {
			return "";
		}
		//若是超出时间,销毁session
		if ($result['utime']+self::$maxlifetime<self::$ctime) {
			self::destroy($sid);
			return "";
		}
		//若是用户换了ip或换了浏览器
		if ($result['uip']!=self::$uip||$result['uagent']!=self::$uagent) {
			self::destroy($sid);
			return "";
		}
		return $result['sdata'];
	}

	//写入
	public static function write($sid,$data){
		$sql="select * from session where sid = ?";
		$stmt=self::$pdo->prepare($sql);
		$stmt->execute(array($sid));
		$result=$stmt->fetch(PDO::FETCH_ASSOC);

		if($result){
			//更新数据  若是数据和原来的不同才更新
			if ($result['sdata']!=$data||$result['utime']+10<self::$ctime) {
				$sql="update session set sdata=?,utime=? where sid=?";
				$stmt=self::$pdo->prepare($sql);
				$stmt->execute(array($data,self::$ctime,$sid));
			}
			
		}else{
			//没有数据,插入数据
			if (!empty($data)) {
				$sql="insert into session(sid,sdata,utime,uip,uagent) values(?,?,?,?,?)";
				$stmt=self::$pdo->prepare($sql);
				$stmt->execute(array($sid,$data,self::$ctime,self::$uip,self::$uagent));
			}
		}
		
		
		
	}
	//销毁
	public static function destroy($sid){
		$sql="delete from session where sid=?";
		$stmt=self::$pdo->prepare($sql);
		return $stmt->execute(array($sid));
	}
	//垃圾回收
	public static function gc($maxlifetime){
		$sql="delete from session where utime<?";
		$stmt=self::$pdo->prepare($sql);
		return $stmt->execute(array(self::$ctime-self::$maxlifetime));
	}

}
	DbSession::start($pdo);
 ?>
相关文章
相关标签/搜索