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 相关文章推荐
php入门教程 精简版
Dec 13 PHP
PHP 变量的定义方法
Jan 26 PHP
在字符串指定位置插入一段字符串的php代码
Feb 16 PHP
我的php学习笔记(毕业设计)
Feb 21 PHP
解析在apache里面给php写虚拟目录的详细方法
Jun 24 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
Jul 08 PHP
PHP常用的排序和查找算法
Aug 06 PHP
使用php-timeit估计php函数的执行时间
Sep 06 PHP
php简单实现多语言切换的方法
May 09 PHP
php实现的http请求封装示例
Nov 08 PHP
Laravel中的Blade模板引擎示例详解
Oct 10 PHP
laravel框架 laravel-admin上传图片到oss的方法
Oct 13 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手册及PHP编程标准
2006/12/17 PHP
PHP小技巧搜集,每个PHPer都来露一手
2007/01/02 PHP
php中设置多级目录session的问题
2011/08/08 PHP
PHP读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
php使用CutyCapt实现网页截图保存的方法
2016/10/03 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
js几秒以后倒计时跳转示例
2013/12/26 Javascript
Javascript获取当前时间函数和时间操作小结
2014/10/01 Javascript
JavaScript表格常用操作方法汇总
2015/04/15 Javascript
jQuery zTree加载树形菜单功能
2016/02/25 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
2017/04/13 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
vue环境搭建简单教程
2017/11/07 Javascript
JavaScript实现百度搜索框效果
2020/03/26 Javascript
vue的toast弹窗组件实例详解
2018/05/14 Javascript
Nuxt升级2.0.0时出现的问题(小结)
2018/10/08 Javascript
利用百度echarts实现图表功能简单入门示例【附源码下载】
2019/06/10 Javascript
Vue 子组件与数据传递问题及注意事项
2019/07/11 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
2019/12/16 Javascript
8个非常实用的Vue自定义指令
2020/12/15 Vue.js
python中OrderedDict的使用方法详解
2017/05/05 Python
Python中单例模式总结
2018/02/20 Python
python scrapy重复执行实现代码详解
2019/12/28 Python
Python根据字符串调用函数过程解析
2020/11/05 Python
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
NBA欧洲商店(法国):NBA Europe Store FR
2016/10/19 全球购物
YSL圣罗兰美妆俄罗斯官网:Yves Saint Lauret RU
2020/09/23 全球购物
2014年应届大学生自我评价
2014/01/09 职场文书
两只小狮子教学反思
2014/02/05 职场文书
2014年国庆节庆祝建国65周年比赛演讲稿
2014/09/21 职场文书
教师个人总结范文
2015/02/11 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers
Java tomcat手动配置servlet详解
2021/11/27 Java/Android
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang