开启会话session,cookies则不需要开启
session_start()之前不能有任何输出,header()也是如此
这个函数向客户端发一个sessionid保存在cookie中,第一次访问的时候,在服务器创建一个和客户端同名的session文件
sessioin_start() $_SESSION['useranem']='colin'//存储数据
4、session.name:这个就是SessionID储存的变量名称,可能是Cookie,也可能是Query_String来传递,默认值 是“PHPSESSID”;
第二次访问,当浏览器的session_id相同时,服务端不会再次创建新的session文件。
5、删除session数据,清空$_SESSION数组就是清空服务器端session文件里面的数据
unset($_SESSION['USERNMAE']);//删除单个数据 $_SESSION=array();//服务端session文件依然存在 session_destory(); // 删除服务端session文件 setCookie(session_name(),"",time()-3600,"/");//删除cookie中的session变量名
6、session配置 (phpinfo()可以很好的查看所有的配置选项) 可以在php.in中修改
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不能永久使用!
session.gc_maxlifetime:Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除! session.auto_start: 是否自动开启session
session.cookie_path: '/" cookie在根目录中储存,特别注意删除cookie时也要删除'/'下的所有cookie
7、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垃圾回收机制的。
8、自定义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); ?>