session和cookie

发布于 2019-04-15  278 次阅读


session和cookie

[TOC]


session和cookie的原理

session好比超市的储物柜,cookie好比顾客的口袋,当用户请求时,储物柜返回一张写着编码的便条纸(session_id),用户就把便条放入口袋(cookie),一个用户(浏览器)对应于一个储物盒(session文件),用来存放用户的物品

原理图:

session文件存放位置:

1
php.ini

`


1
session.save_path="D:\code\phpSstudy\tmp\tmp"

session_start()

sess_f5b3tei2q8ankm24vm95ot5r12

cookie 名字一样后面

代码为:


1
$_SESSION['ff']=2;

时,火狐访问,对应的cookie->session文件中:

1
ff|i:2;

代码为:


1
$_SESSION['ch']=3;

时,谷歌访问,对应的cookie->session文件中:

1
ch|i:3;

代码为:


1
setcookie("firefox",'55');

Response Cookie:

Name Value
firefox 55

代码为:


1
setcookie("chrome",'66');

Response Cookie:

Name Value
chrome 66

session 在服务器的某个位置

cookie在用户浏览器里面 session_Id存储在cookie里面


session

命名空间:


1
use think\Session;

session配置:


1
2
3
4
5
6
7
8
9
10
11
'session'                => [
    'id'             => '',
    // SESSION_ID的提交变量,解决flash上传跨域
    'var_session_id' => '',
    // SESSION 前缀
    'prefix'         => 'think',
    // 驱动方式 支持redis memcache memcached
    'type'           => '',    //存储方式,默认是文件存储
    // 是否自动开启 SESSION
    'auto_start'     => true,
],

使用session

实际上是操作$_SESSION数组


1
2
3
4
5
6
Session::set('name','66666','think2');
        //name value prefix(前缀/作用域)
        //第三个参数不填时默认是配置中的"prefix"的值"think"
echo "\n";
print_r($_SESSION);
exit;

输出:


1
2
3
4
5
6
<br />Array (
    [think2] =&gt; Array
        (
            [name] =&gt; 66666
        )
)

session文件:


1
think2|a:1:{s:4:"name";s:5:"66666";}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//判断作用域下面元素的值是否存在
Session::has('name','think2'); //name不存在就不显示,否则显示1
                    //参数2不写默认配置中的"prefix"的值"think"
Session::has('name.item','think2');
//获取作用域下面元素的值
Session::get('name','think2');
Session::get('name.item','think2');

echo $this-&gt;request-&gt;session('name');

//设置作用域下面元素的值
Session::set('name','value','think2');
Session::set('name.item','value','think2');
                        //$name['item']=value
//删除作用域下面元素的值
Session::delete('name','think2');
Session::delete('name.item','think2');
//清除作用域
Session::clear('think2');

助手函数:


1
2
3
4
5
6
7
8
9
10
//设置
session('name','thinkphp','prefix');
//判断
session('?name','','prefix');
//获取
session('name','','prefix');
//清除
session('name',null,'prefix');
//清除作用域
session(null,'prefix');

在模板文件中使用session:


1
{Request.session.name}

cookie

cookie存在于客户端

命名空间:


1
use think\Cookie;

cookie的配置:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
'cookie'                 =&gt; [
    // cookie 名称前缀
    'prefix'    =&gt; '',
    // cookie 保存时间
    'expire'    =&gt; 0,
    // cookie 保存路径
    'path'      =&gt; '/',
    // cookie 有效域名
    'domain'    =&gt; '',
    //  cookie 启用安全传输
    'secure'    =&gt; false,
    // httponly设置
    'httponly'  =&gt; '',
    // 是否使用 setcookie
    'setcookie' =&gt; true,
],

cookie操作

实际上是操作$_COOKIE数组


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//设置
Cookie::set('name','value',3600);//name value option[time/s]
//指定前缀
Cookie::set('name','value',['prefix' =&gt; 'think_','expire' =&gt; 7200]);
//支持数组
Cookie::set('name',['v1','v2','v3','v4']);

//获取
Cookie::get('name','prefix');
$this-&gt;request-&gt;cookie('name');

//判断
Cookie::has('name','prefix');
//删除
Cookie::delete('name','prefix');
//清空前缀的
Cookie::clear('prefix');

函数助手:


1
2
3
4
5
6
7
8
9
10
11
12
//初始化
cookie(['prefix' =&gt; 'think_','expire' =&gt; 3600]);
//设置
cookie('name','value',3600);
//获取
cookie('name');
//判断
cookie('?name');
//删除
cookie('name',null);
//清空前缀的
cookie(null,'prefix');

先这样,以后再改吧