session和cookie
[TOC]
session和cookie的原理
session好比超市的储物柜,cookie好比顾客的口袋,当用户请求时,储物柜返回一张写着编码的便条纸(session_id),用户就把便条放入口袋(cookie),一个用户(浏览器)对应于一个储物盒(session文件),用来存放用户的物品
原理图:
graph TB
用户1--请求session_id-->服务器
服务器--分配session_id-->用户1
用户2--请求session_id-->服务器
服务器--分配session_id-->用户2
服务器-->用户1文件
服务器-->用户2文件
style 用户1 fill:#f9f,stroke:#333,stroke-width:4px,fill-opacity:0.5
style 用户2 fill:#f9f,stroke:#333,stroke-width:4px,fill-opacity:0.5
style 用户1文件 fill:#f9f,stroke:#333,stroke-width:4px,fill-opacity:0.5
style 用户2文件 fill:#f9f,stroke:#333,stroke-width:4px,fill-opacity:0.5
style 服务器 fill:#ccf,stroke:#f66,stroke-width:2px,stroke-dasharray: 10,5
session文件存放位置:php.ini
`
session.save_path="D:\code\phpSstudy\tmp\tmp"
session_start()
sess_f5b3tei2q8ankm24vm95ot5r12
cookie 名字一样后面
代码为:
$_SESSION['ff']=2;
时,火狐访问,对应的cookie->session文件中:
ff|i:2;
代码为:
$_SESSION['ch']=3;
时,谷歌访问,对应的cookie->session文件中:
ch|i:3;
代码为:
setcookie("firefox",'55');
Response Cookie:
Name | Value |
firefox | 55 |
代码为:
setcookie("chrome",'66');
Response Cookie:
Name | Value |
chrome | 66 |
session 在服务器的某个位置
cookie在用户浏览器里面 session_Id存储在cookie里面
session
命名空间:
use think\Session;
session配置:
'session' => [
'id' => '',
// SESSION_ID的提交变量,解决flash上传跨域
'var_session_id' => '',
// SESSION 前缀
'prefix' => 'think',
// 驱动方式 支持redis memcache memcached
'type' => '', //存储方式,默认是文件存储
// 是否自动开启 SESSION
'auto_start' => true,
],
使用session
实际上是操作$_SESSION数组
Session::set('name','66666','think2');
//name value prefix(前缀/作用域)
//第三个参数不填时默认是配置中的"prefix"的值"think"
echo "\n";
print_r($_SESSION);
exit;
输出:
Array (
[think2] => Array
(
[name] => 66666
)
)
session文件:
think2|a:1:{s:4:"name";s:5:"66666";}
//判断作用域下面元素的值是否存在
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->request->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');
助手函数:
//设置
session('name','thinkphp','prefix');
//判断
session('?name','','prefix');
//获取
session('name','','prefix');
//清除
session('name',null,'prefix');
//清除作用域
session(null,'prefix');
在模板文件中使用session:
{Request.session.name}
cookie
cookie存在于客户端
命名空间:
use think\Cookie;
cookie的配置:
'cookie' => [
// cookie 名称前缀
'prefix' => '',
// cookie 保存时间
'expire' => 0,
// cookie 保存路径
'path' => '/',
// cookie 有效域名
'domain' => '',
// cookie 启用安全传输
'secure' => false,
// httponly设置
'httponly' => '',
// 是否使用 setcookie
'setcookie' => true,
],
cookie操作
实际上是操作$_COOKIE数组
//设置
Cookie::set('name','value',3600);//name value option[time/s]
//指定前缀
Cookie::set('name','value',['prefix' => 'think_','expire' => 7200]);
//支持数组
Cookie::set('name',['v1','v2','v3','v4']);
//获取
Cookie::get('name','prefix');
$this->request->cookie('name');
//判断
Cookie::has('name','prefix');
//删除
Cookie::delete('name','prefix');
//清空前缀的
Cookie::clear('prefix');
函数助手:
//初始化
cookie(['prefix' => 'think_','expire' => 3600]);
//设置
cookie('name','value',3600);
//获取
cookie('name');
//判断
cookie('?name');
//删除
cookie('name',null);
//清空前缀的
cookie(null,'prefix');
网友评论