一.纯php中的session
1.Session的作用
PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置。session变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用。
2.Session的工作机制
为每一个访问者创建一个唯一的id(UID),并基于这个UID来存储变量。UID存储于cookie中,亦或通过URL进行传导
3.Session存在的意义
因特网上,存在一个问题:服务器不知道你是谁以及你在做什么,这是由于HTTP地址不能维持状态,通过在服务器上存储用户信息以便随后使用,session用来解决这个问题,会话信息是临时的,用户离开网站之后就会被删除,想要长期使用就要把session存储在数据库
4.开始Session
在您把用户信息存储在PHP session之前,先要启动会话。<?php session_start();?>,必须位于<html>标签之前
上面的代码会向服务器注册用户的会话,以便您可以开始保存用户信息,同时为用户会话分配一个UID
5.存储Session变量
存储和取回session变量的正确方法是使用PHP $_SESSION变量:$_SESSION['views']=1;来进行设置值,并且可以通过$_SESSION['views']来进行取值
isset()检测是否已经设置了$_SESSION
6.终结Session
(1)unset来进行释放指定的session变量
(2)session_destroy() 来彻底终结session,将会重置session,您将会失去所有已经存储的session
二.YII中的Session
1.YII将session和cookie封装成对象来增加一些功能,可以通过面向对象的方式访问他们
2.默认通过yii\web\Session实例的session应用组件来进行访问sessions。例:$session=Yii::$app->session;
1.检查session是否开始: $session->isActive
2.开始session: $session->open();
3.关闭session: $session->close();
4.销毁session: $session->destory(); 销毁session所有的已注册的数据
注意:多次调用open()和close()函数并不会产生错误,因为内部方法会先检查session是否已经开启
2.访问Session数据
(1)获取session变量
$language=$session->get('language');
$language=$session['language'];
$language=isset($_SESSION['language'])?$SESSION['language']:null;
(2)设置session变量
$session->set('language','en-US');
$session['language']='en-US';
$_SESSION['language']='en-US';
(3)删除session变量
unset($session['language']);
unset($_SESSION['language']);
$session->remove('language');
(4)检查session是否存在
isset($session['language'])
isset($_SESSION['language'])
$session->has('language');
(5)session的遍历
foreach($session as $name => $value)
foreach($_SESSION as $name => $value)
注意:当session组件访问session数据的时候,如果session没有开启那么就会自动开启,这和$_SESSION不同,$_SESSION要求先执行session_start().
(6)session数据为数组时,session组件会限制你直接修改数据中的单元项,但是可以访问session数据数组
例如:$session = Yii::$app->session;
$echo $session['captcha']['number'];
$session['captcha']['number']=5; 这句代码不会被执行
$session['captcha'] = [
'number' => 5,
]; 这样去进行修改就可以修改成功
但是不要担心,可以使用下面一个变通的方法来解决问题。
(1)$_SESSION['captcha']['number'] = 5;
(2)先获取session数据到一个数组,修改数组的值,然后保存数组到session中
$captcha = $session['captcha'];
$captcha['number'] = 5;
$session['captcha'] = $captcha;
(3)使用带通用前缀的键来存储数组,(最简易这个写法,可读性高)
$session['captcha.number'] = 5;
(4)使用ArrayObject数组来进行代替数组
$session['captcha'] = new \ArrayObject;
3.Session存储·
yii\web\session默认存储session文件到服务器上,但是session提供了以下类来实现不同的存储。
yii\web\DbSession 表示session存储在数据表中
yii\web\CacheSession 表示session数据存储到缓存里,缓存和配置中的缓存组件有关
yii\redis\Session 表示的是session存储在到以redis为存储媒介中
yii\mongodb\Session 表示的是存储到Mongodb中
所有的session采用相同的api,因此对存储介质进行转换的时候不需要进行改变代码
注意注意:当使用自定义的session存储介质的时候,必须保证yii\web\Session::open()开启,因为要在该方法中注册自定义的session存储处理器