cookie 和 session 是web应用中的会话技术,何为会话技术呢? 说白了就是服务器识别用户跟踪用户的一个功能一个模块,开发中非常重要哦。
我们都知道web是基于HTTP协议实现请求与响应的,关于HTTP网上一搜一箩筐,无非就是客户端和服务器之间协定的一种交互格式。但其有一个不理想的特点就是无状态性,也就是每次请求都是独立的,服务器不知道你是谁想做什么或者说不让你做什么(哪怕你用同一个浏览器)。这时会话控制就派上了用场,这样在访问服务器时由服务器设置一些信息在终端,之后每次请求都会携带这些信息,进而实现跟踪用户在整个网站的活动,也就实现了数据在多次请求周期的共享。
cookie介绍
cookie英文意思是小甜点 我的理解是服务器送给终端的礼物,由终端保存。在终端访问服务器时 由服务器向终端分配一些临时数据,在这些数据有效期内访问服务器 都将携带这些数据,由服务器获取识别 进而做出相应的回应。
cookie的数据特点
单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
数据类型单一 只能是字符串(不过可以考虑序列化数据),数据存储在客户端每次访问要携带所以 会占用一定的带宽,也不是很安全(不要存储重要的数据)。
cookie的使用
setcookie(name, value, expire, path, domain, secure, httponly);
name: 保存的变量名
value: 保存的数据
expire:过期时间 以秒为单位,默认0 浏览器关闭即失效
path:数据有效路径 默认当前路径,向下兼容。、
domain:有效域名 在什么域名下有效。如果使用二级域名的话使用 .domain.com
secure:是否安全传输 默认否 (https:)为安全传输
httponly:是否只用于http传输使用,默认否(终端脚本可以获取数据)。
一般情况下只是如下用法
setcookie('name', 'tom'); //设置
$_COOKIE['name]; //获取 使用超全局变量
setcookie('name', '', time()-1); 或 setcookie('name',''); //删除
cookie的使用场景
比如说 一周内免登录,未登录下的我的足迹,浏览历史等。
session介绍
我们在介绍cookie中说过cookie的特点 存储在终端 容量小 占带宽 不安全等特点,当然也有其优点 如存储一些不重要的数据做一些配合动作也是很实用的,再加上加密和序列化行为那也是十分强大的。有了对比再说session 理解起来就好多了,
session的数据是存储在服务器端的,是不是有个疑惑 数据存在服务器那怎么跟踪用户 这不白闹吗?其实使用session还是离不开cookie的(有一种基于url的实现方式后面讲到),
session的工作原理是这样的 在服务器开启session后 终端请求服务器之初就会自动生成一个session_id 的数据保存在终端用于唯一的指向服务器session、数据区的某个会话数据,看清楚哦是唯一的指向。这样就好比 你去一家超市 店员给你办了张会员卡,卡上有唯一的编码 而你的姓名 年龄 喜好 会员级别等数据都存储在超市的电脑里,这样实现用户识别了。由于session是服务器技术 于是乎就有了很大的战略纵深(个性化设置),
session的使用
session可操作的数据类型很丰富,4种标量2种复合类型都可以。
session_start(); //开启session 不能重复开启可以用@错误过滤
$_SESSION['name'] = 'tom'; //设置session
$_SESSION['name']; //获取
unset($_SESSION['name']); //删除单个数据
$_SESSION = NULL; 或 session_unset(); //删除全部session数据
session_distroy(); //清空物理数据文件
setcookie(session_name(), '', time()-1); //删除cookie中存储的session_id
温习两个函数 1.session_name()-设置获取session_id 的键 (SESSID)
2.session_id()-设置获取session_id 的值
基于url的session的实现
我们知道cookie是客户端功能 当然客户可以自由的开启和关闭,那么引出一个问题,客户端关闭cookie、后session是不是就失效了,答案是肯定的。那该如何实现用户跟踪呢,我们可以为session正常的使用设立第二道防线,那就是利用url、在各个脚本间传递session_id的值。具体实现如下。
1.使用两个函数 session_name()获取当前会话的名称、session_id()获取和设置当前会话的ID 拼接为请求字符串连接在各个url连接后面。
如:http://www.baidu.com/index.php?sname=sid
2.在其他页面接收这个sid 注册为当前session_id
如:if ( isset( $_GET[session_name()] ) ){
session_id( $_GET[session_name()); //注册为当前的session_id
}
session_start(); //不要忘记注册session_id后开启session 开启已有会话 否侧创建新会话
按照这样操作是不是感觉太繁琐 哪个页面页至少也有几十上百个链接吧,难免会有疏忽。值得高兴的是php已经为我们提供了更为简单的方式,不过原理还是那个原理。具体实现如下、
1.设置配置项
开启session_use_trans_sid = 1 //开启自动追加session_id
关闭session.use_only_cookies = 0 //关闭仅使用cookie项
后系统会在cookie关闭之后自动的为每个链接加上session_id 数据(链接上会有显示)。
2.依然需要在其它页面进行判断接收这个session_id 进行注册。(语法如上不变).
session属性
session是基于cookie实现的,session-id 存储在cookie中,所以 这个session-id的属性决定了session的属性。
配置项中有对应设置
session.cookie_life = 0; //有效期(默认浏览器关闭)
session.cookie_path = '/'; //默认跟路径
session.cookie_domain = ; //有效域名
session.cookie_secure = ; //是否安全传输 HTTPS
session.cookie_httponly = ; //是否只http传输
推荐使用 session_set_cookie_params(expire, path, domain, secure, httponly); 来设置这些属性
以上是对于终端session_id属性的设置 接下来看看服务器端配置
session_save_path //session数据存储路径
session_name = PHPSESSID; //保存在cookie中sessionid的键
session_start = 0; //是否自动开启session
session_use_trans_sid ;//是否开启自动传递SID 功能
session_use_only_cookie = 1; //是否只依赖cookie传递SID
session.gc_maxlifetime = 1440; //session数据及文件生存周期 24分钟后视为垃圾
session.gc_probability = 1;
session.gc_dirisor = 100;
//以上两个配置组合成了session的垃圾回收机制回收的概率,默认100次请求触发1次垃圾回收。session垃圾回收机制是惰性删除 过期之后不会马上删除而是等待回收概率的触发。
session_save_handler = files; // session默认的保存介质 文件
会话的基本使用已经介绍完毕如果有错误还请提出 在此表示感谢!!!