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);
 ?>
相關文章
相關標籤/搜索