开启会话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); ?>