開啓會話session,cookies則不須要開啓php
session_start()以前不能有任何輸出,header()也是如此sql
這個函數向客戶端發一個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); ?>