PHP的cookie与session原理及用法详解


Posted in PHP onSeptember 27, 2019

本文实例讲述了PHP的cookie与session原理及用法。分享给大家供大家参考,具体如下:

产生背景

HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。于是需要引入一种机制,COOKIE于是就顺应而生。

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。

理解例子

以前大学的时候,经常去大卡司去喝奶茶,每喝一杯,都可以得到一个印花(第一次喝的时候他会给你个积分卡片),集齐6个印花之后,就可以免费获得一杯奶茶。这样子,印花的信息是保存在客户的积分卡上,你如果不怀好意的话,就自己搞几个神似的印花去骗奶茶喝吧。哈哈,这样子是不是更符合在客户端端(cookie)保持状态。而拿银行卡去银行取钱,我们的卡只需要保存一个卡号,更多的信息是保存在服务器中(session),这样也比较符合服务器端保持状态。

具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,

简述cookie

PHP工作原理:PHP通过setcookie函数进行Cookie的设置,任何从浏览器发回的Cookie,PHP都会自动的将他存储在$_COOKIE的全局变量之中,因此我们可以通过$_COOKIE['key']的形式来读取某个Cookie值。

用途:PHP中的Cookie具有非常广泛的使用,经常用来存储用户的登录信息,购物车等,且在使用会话 Session时通常使用Cookie来存储会话id来识别用户,Cookie具备有效期,当有效期结束之后,Cookie会自动的从客户端删除。同时为 了进行安全控制,Cookie还可以设置域跟路径。

PHP的cookie与session原理及用法详解

函数Cookie

PHP设置Cookie最常用的方法就是使用setcookie函数,setcookie具有7个可选参数,我们常用到的为前5个:

  • name( Cookie名)可以通过$_COOKIE['name'] 进行访问
  • value(Cookie的值)
  • expire(过期时间)Unix时间戳格式,默认为0,表示浏览器关闭即失效
  • path(有效路径)如果路径设置为'/',则整个网站都有效
  • domain(有效域)默认整个域名都有效,如果设置了'www.imooc.com',则只在www子域中有效
$value = 'test';
setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+3600); //有效期一小时
setcookie("TestCookie", $value, time()+3600, "/path/", "imooc.com"); //设置路径与域

PHP中还有一个设置Cookie的函数setrawcookie,setrawcookie跟setcookie基本一样,唯一的不同就是value值不会自动的进行urlencode,因此在需要的时候要手动的进行urlencode。

setrawcookie('cookie_name', rawurlencode($value), time()+606024*365);

因为Cookie是通过HTTP标头进行设置的,所以也可以直接使用header方法进行设置。

header("Set-Cookie:cookie_name=value");

删除cookie

PHP设置Cookie最常用的方法就是使用setcookie函数,setcookie具有7个可选参数,我们常用到的为前5个:

  • name( Cookie名)可以通过$_COOKIE['name'] 进行访问
  • value(Cookie的值)
  • expire(过期时间)Unix时间戳格式,默认为0,表示浏览器关闭即失效
  • path(有效路径)如果路径设置为'/',则整个网站都有效
  • domain(有效域)默认整个域名都有效,如果设置了'www.imooc.com',则只在www子域中有效
$value = 'test';
setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+3600); //有效期一小时
setcookie("TestCookie", $value, time()+3600, "/path/", "imooc.com"); //设置路径与域

PHP中还有一个设置Cookie的函数setrawcookie,setrawcookie跟setcookie基本一样,唯一的不同就是value值不会自动的进行urlencode,因此在需要的时候要手动的进行urlencode。

setrawcookie('cookie_name', rawurlencode($value), time()+606024*365);

因为Cookie是通过HTTP标头进行设置的,所以也可以直接使用header方法进行设置。

header("Set-Cookie:cookie_name=value");

简述session

PHP的cookie与session原理及用法详解

在PHP中使用session非常简单,先执行session_start方法开启session,然后通过全局变量$_SESSION进行session的读写。

session_start();
$_SESSION['test'] = time();
var_dump($_SESSION);

删除session

在PHP中使用session非常简单,先执行session_start方法开启session,然后通过全局变量$_SESSION进行session的读写。

session_start();
$_SESSION['test'] = time();
var_dump($_SESSION);

session会自动的对要设置的值进行encode与decode,因此session可以支持任意数据类型,包括数据与对象等。

session_start();
$_SESSION['ary'] = array('name' => 'jobs');
$_SESSION['obj'] = new stdClass();
var_dump($_SESSION);

默认情况下,session是以文件形式存储在服务器上的,因此当一个页面开启了session之后,会独占这个session文件,这样会导致当前用户的其他并发访问无法执行而等待。可以采用缓存或者数据库的形式存储来解决这个问题,这个我们会在一些高级的课程中讲到。

session存储用户信息

session可以用来存储多种类型的数据,因此具有很多的用途,常用来存储用户的登录信息,购物车数据,或者一些临时使用的暂存数据等。
用户在登录成功以后,通常可以将用户的信息存储在session中,一般的会单独的将一些重要的字段单独存储,然后所有的用户信息独立存储。

$_SESSION['uid'] = $userinfo['uid'];
$_SESSION['userinfo'] = $userinfo;

一般来说,登录信息既可以存储在sessioin中,也可以存储在cookie中,他们之间的差别在于session可以方便的存取多种数据类型, 而cookie只支持字符串类型,同时对于一些安全性比较高的数据,cookie需要进行格式化与加密存储,而session存储在服务端则安全性较高。

<?php
session_start();//假设用户登录成功获得了以下用户数据
$userinfo = array(
  'uid' => 10000,
  'name' => 'spark',
  'email' => 'spark@imooc.com',
  'sex' => 'man',
  'age' => '18');
header("content-type:text/html; charset=utf-8");
/* 将用户信息保存到session中 */
$_SESSION['uid'] = $userinfo['uid'];
$_SESSION['name'] = $userinfo['name'];
$_SESSION['userinfo'] = $userinfo;
//* 将用户数据保存到cookie中的一个简单方法 */
$secureKey = 'imooc'; //加密密钥
$str = serialize($userinfo); //将用户信息序列化//用户信息加密前
$str = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($secureKey), $str, MCRYPT_MODE_ECB));//用户信息加密后//将加密后的用户数据存储到cookie中
setcookie('userinfo', $str);
//当需要使用时进行解密
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($secureKey), base64_decode($str), MCRYPT_MODE_ECB);
$uinfo = unserialize($str);
echo "解密后的用户信息:<br>";
print_r($uinfo);

异同

PHP的cookie与session原理及用法详解

1.cookie将数据存储在客户端,建立起用户与服务器之间的联系,session是将用户的会话数据存储在服务端
2.cookie相对不是太安全,容易被盗用导致cookie欺骗
3.单个cookie的值最大只能存储4k  session没有大小限制
4.每次请求都要进行网络传输,占用带宽
5.通过一个session_id进行用户识别,PHP默认情况下session id是通过cookie来保存的,因此从某种程度上来说,seesion依赖于cookie。但这不是绝对的,session id也可以通过参数来实现,只要能将session id传递到服务端进行识别的机制都可以使用session。

jQuery Cookie 插件

引入

<script src="https://cdn.staticfile.org/jquery/3.4.0/jquery.min.js"></script> 
<script src="https://cdn.staticfile.org/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>

设置删除

$.cookie('name', 'value', { expires: 7, path: '/' });
$.removeCookie('name'); // => true

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
11个PHP 分页脚本推荐
Aug 15 PHP
php实现的一个很好用HTML解析器类可用于采集数据
Sep 23 PHP
php 判断服务器操作系统的类型
Feb 17 PHP
php实现字符串首字母转换成大写的方法
Mar 17 PHP
php文件压缩之PHPZip类用法实例
Jun 18 PHP
PHP创建多级目录的两种方法
Oct 28 PHP
详解Yii实现分页的两种方法
Jan 14 PHP
超强多功能php绿色集成环境详解
Jan 25 PHP
Yii2实现多域名跨域同步登录退出
Feb 04 PHP
PHP实现Huffman编码/解码的示例代码
Apr 20 PHP
Laravel 框架返回状态拦截代码
Oct 18 PHP
PHP设计模式之命令模式示例详解
Dec 20 PHP
PHP下载文件函数与用法示例
Sep 27 #PHP
PHP的JSON封装、转变及输出操作示例
Sep 27 #PHP
php面向对象重点知识分享
Sep 27 #PHP
php中关于换行的实例写法
Sep 26 #PHP
php伪静态验证码不显示的解决方案
Sep 26 #PHP
php源码的安装方法和实例
Sep 26 #PHP
php源码的使用方法讲解
Sep 26 #PHP
You might like
PHP中的正规表达式(一)
2006/10/09 PHP
php中常用编辑器推荐
2007/01/02 PHP
php 高效率写法 推荐
2010/02/21 PHP
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
thinkphp框架下404页面设置 仅三步
2016/05/14 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
php+laravel依赖注入知识点总结
2019/11/04 PHP
php实现统计IP数及在线人数的示例代码
2020/07/22 PHP
JavaScript 权威指南(第四版) 读书笔记
2009/08/11 Javascript
JavaScript全局函数使用简单说明
2011/03/11 Javascript
Jquery进度条插件 Progress Bar小问题解决
2011/07/12 Javascript
JavaScript 实现类的多种方法实例
2013/05/01 Javascript
jquery之超简单的div显示和隐藏特效demo(分享)
2013/07/09 Javascript
JavaScript中奇葩的假值示例应用
2014/03/11 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
Vue.js中数组变动的检测详解
2016/10/12 Javascript
Vue+Element UI+Lumen实现通用表格分页功能
2019/02/02 Javascript
vue+canvas实现移动端手写签名
2020/05/21 Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
2020/07/22 Javascript
jQuery实现雪花飘落效果
2020/08/02 jQuery
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
Python计算三角函数之asin()方法的使用
2015/05/15 Python
pandas进行数据的交集与并集方式的数据合并方法
2018/06/27 Python
python-opencv 将连续图片写成视频格式的方法
2019/01/08 Python
浅谈Python中的继承
2020/06/19 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
基督教卡片、励志礼品、家居装饰等:DaySpring
2018/10/12 全球购物
医院检讨书范文
2014/02/01 职场文书
高中生的自我评价
2014/03/04 职场文书
《社戏》教学反思
2014/04/15 职场文书
教师四风问题整改措施
2014/09/25 职场文书
学校开除通知书
2015/04/25 职场文书
西柏坡观后感
2015/06/08 职场文书
远程教育学习心得体会
2016/01/23 职场文书
90行Python代码开发个人云盘应用
2021/04/20 Python