了解什么是会话?cookie和session的一些基础知识,请看下边文章:
Session以及模拟会话机制
https://blog.csdn.net/yt_php/article/details/80287439
【小白】session基础
https://blog.csdn.net/yt_php/article/details/80464890
《laravel框架关键技术解析》
会话篇
1,cookie分为两类:A会话cookie、B持久cookie。
时间:A退出浏览器则被删除。B退出浏览器、计算机重启依然存在。
存贮:A内存、B磁盘。
2,会话Cookie在客户端(浏览器)、服务端之间的传递
[客户端] <----响应首部Set-Cookie:id=1----[服务端PHP setcookie(“id”,“1”)设置]
[客户端] -------请求首部Cookie:id=1-------->[服务端PHP $_COOKIE()获取]
3,持久cookie一般需要通过Expires、Max-Age参数特殊配置
两者都是用来指定文档的过期时间,但是二者有一些细微差别:
1.Expires在HTTP/1.0中已经定义,Cache-Control:max-age在HTTP/1.1中才有定义,为了向下兼容,仅使用max-age不够;
2.Expires指定一个绝对的过期时间(GMT格式:Expires: Thu(星期), 01 Dec(月) 1994 16:00:00 GMT),这么做会导致至少2个问题:
(1) 客户端和服务器时间不同步导致Expires的配置出现问题
(2) 很容易在配置后忘记具体的过期时间;
3.max-age 指定的是从文档被访问后的存活时间,这个时间是个相对值(比如:3600s),相对的是文档第一次被请求时服务器记录的Request_time(请求时间)
4.Expires指定的时间可以是相对文件的最后访问时间(Atime=AccessTime)或者修改时间(MTime)
原文:https://blog.csdn.net/luoluoyu2013/article/details/40984961
4,Expires、Max-Age参数
服务端PHP:
setcookie("id","1",time()+3600)
响应头部:星期三,2019-01-03 01:15:15过期,有效期3600s。
"Set-Cookie:id=1;expires=Thu,03-Jan-2019 01:15:15 GMT;Max-Age=3600"
5,Cookie的删除
setcookie("id","",time()-10);
6,Transfer-Encoding:chunked
HTTP1.1采用了持久的连接,也就是一次TCP的连接不马上释放,允许许多的请求跟响应在一个TCP的连接上发送,所以客户机与服务器需要某种方式来标示一个报文在哪里结束和在下一个报文在哪里开始。简单的方法是使用呢content-length,但这只有当报文长度可以预先判断的时候才起作用,而对于动态的内容或者在发送数据前不能判定长度的情况下,可以使用分块的方法来传送编码。
原文:https://blog.csdn.net/whatday/article/details/7571451
7,session_start()
先判断客户端是否携带了sessionID
----->第一次请求:
请求报文:Cookie:无PHPSESSID
未携带:
则将sessionID添加到响应首部,
响应报文:Set-Cookie:PHPSESSID=ppqfhplmkf1b372sr4cefi92797; path=/
,
生成一个同名的文件存贮在服务器中
[file] : ppqfhplmkf1b372sr4cefi92797
----->第二次请求:
请求报文:Cookie:PHPSESSID=ppqfhplmkf1b372sr4cefi92797
携带:
不再创建新的session文件
将文件中数据读取到$_SESSION数组中
8,Session数据的删除
删除单个数据
//开启session 打开文件、读取文件数据至$_SESSION
session_start();
unset($_SESSION['name']);
删除全部数据
//1开启session 打开文件、读取文件数据至$_SESSION
session_start();
//2清空$_SESSION数组
$_SESSION = array();
//3删除客户端Cookie中的sessionID 注: session_name()='PHPSESSID'
setcookie(session_name(),'',time()-10,'/');
//删除服务器中的session文件
session_destory();
9,setcookie()和session_start()之前不能有输出
setcookie()函数向浏览器设置cookie,由于Cookie是通过报文首部传输的,所以在函数前不允许有输出,即报文主体内容。
session_start()函数将sessionID添加到响应首部。同上。