会话技术:即实现登陆标志的存储,要求其能区分浏览器,并在浏览器的多次请求周期内,可以持久存储的一种存储机制.
【注:该登陆标志不能用数据(变量,常量)来标记,因为数据都有一定的生命周期,一个脚本的周期(浏览器向服务器发送一次请求,服务器将该请求交由php处理,php处理完了给服务器,服务器响应给浏览器,就是一个脚本周期)】
【注:文件存储:在服务器管理的文件(数据库中)是不区分浏览器端对于任何一个浏览器都是通用的】
前提:b/s请求响应模式,是无状态的(任意的请求间,不存在任何联系,不能将请求状态保持下去).
会话技术的实现: 1.cookie 2.session
cookie:的获取(查)
获取:浏览器再请求时携带cookie数据;
使用超全局数组变量,$_COOKIE完成对cookie数据的获取 ;
php核心,在初始化阶段,会将所有请求的cookie数据整理到$_COOKIE变量中,共php脚本使用;
其中每个$_COOKIE中的元素,对应一个cookie变量,元素的键是cookie的key,值是cookie的value;
cookie的特征:
有效期:
默认:(临时cookie或会话cookie)
会话周期(浏览器关闭)结束;
支持设置有效期:
setcookie()的第三个参数可以对有效期进行设置,有效期采用一个时间戳进行表示!
setcookie('cookie_key','cookie_value',time()+60),[time()是当前时间+任意想保留的时间];在规定时间后cookie值失效【浏览其判断其失效】;
语法:特殊有效期值
0,默认的表示会话周期;
time()-1,标准的删除cookie操作,setcookie('cookie_key','',time()-1)或者setcookie('cookie_key',''),setcookie('cookie_key');
PHP_INT_MAX;逻辑上的表示永久有效的cookie,截止时间是: 2038.01.19.11+
有效路径:(路径第一个/之后的内容)
默认:cookie在当前路径及其后代路径有效
Tip:路径,不是代码所在文件的本地磁盘路径
Tip:不同路径下,同名的cookie可以同时存储于浏览器端;只是浏览器发出请求时,
会先查找当前目录内有效的cookie,在向上查找,将所有有效的都写带到服务器端,
服务器在形成$_COOKIE时,会出现重写效果,先出现的保留!
可以通过第四个参数对cookie()进行修改:通常设置为/ 表示,站点根目录有效,也就是
整站有效!
setcookie('cookie_key','cookie_value',time()+60,'/');
Tip:有效路径判断也在浏览器端,服务器会将有效路径设置值告知浏览器,
【可在F12下网络消息查看】
语法:
'' 默认值
有效域:(路径第一个/之前的内容)
默认:cookie只在当前域下有效;
可以通过设置,使cookie的有效域扩展到一级域名下的所有子域;
eg:test.kang.com shop.kang.com
.kang.com 一级域名 test.lang.com二级域名
第五个参数可以设置:setcookie('cookie_key','cookie_value',time()+60,'/','kang.con')
是否安全传输:建议该属性设置为false
https:// 加密的http协议
默认:cookie,不论是http还是https都会将有效的cookie携带到服务器端;
如果将第六个参数设置为true,表示激活仅安全连接传输,此时浏览器再向服务
器发送请求时,如果请求协议为http,就不会向服务器发送这些设置为仅安全传输
的cookie数据。
setcookie('not_secure','topcoder',0,'','',false);//不开启仅安全传输
setcookie('do_secure','topcoder',0,'','',true);//开启仅安全传输
HTTPONLY:建议该属性设置为true
默认:浏览器存储的cookie是可以被其他脚本所处理的
通过第七个参数,设置为HTTPONLY特性,仅在http请求中使用;
setcookie('not_secure','topcoder',0,'','','false',false);//不开启HTTOONLY
setcookie('do_secure','topcoder',0,'','','false',true);//开启HTTPONLY
语法:1.cookie值:仅仅支持字符串类型;
2.cookie的键,可以写成下标数组的形式
setcookie('studert[name]','kang');//事实上是两个cookie但是在使用时被整
setcookie('student[age]','zhang');//理成¥了数组[在服务器浏览器他都是单个的];
3.$_COOKIE仅仅是浏览器请求时携带的cookie
但前脚本周期内,设置的cookie,不能再$_COOKIE中存在的,只能当前脚本
结束做响应的时候才传递给浏览器端,浏览器在下次请求时才能携带cookie值
eg:setcookie('name','zhao');var_sump($_COOKIE['name']);//写在同一页
面内【第一次请求该页面时会报错,但是第二次再请求不会报错了】;
4.类似header(),在setcookie()也不能存在任何的输出;【虽然在配置文件中可以
设置(输出缓冲区output_buffering=4096),但是尽量不要违反语法规则】
COOKIE的两大弊端:①会话原文存储于浏览器端,原始数据安全性较低
②如果cookie数据量较大,由于每次请求都要携带,增加带宽的使用(效率变慢)
SESSION:
使用session技术来实现将绘画数据存储于服务器端,同时可以区分浏览器!
sessio为每个 绘画数据建立独立的会话数据区(来存储当前会话的全部数据),每个会话数据区存在唯一的的标志,同时浏览器端存储该唯一标识,作配对使用;
基本操作:
开启session 机制:
函数开启:session_star();【没一个脚本周期之内,如果用session都必须先开启session 】
也可以设置php.ini设置为自动开启:session.auto_start =0(默认值不开启)
利用$_SESSION操作session数据:
1.增 删 改 查 都是使用$_SESSION完成,每个元素都是session数据;
2.就先操作普通数组一样,操作$_SESSION数组,就可以完成对session数据的操作;
$_SESSION['class_name']='php34';//增
unset($_SESSION['class_name']);//删
$_SESSION['class_name']='topcoder';//改
echo $_SESSION['class_name'];//查
3.存储与浏览端cookie中的session_id,就是一个普通的cookie变量(在session中有特殊的含义)
4.每个会话所生成的存储于服务器端的session数据区,默认是以文件的形式,存储于服务器端操作系统
中的临时文件;
SESSION数据的特征:[session属性通常会保持默认值,不建议修改]
有效期:会话周期结束;session.cookie_lifetime=0 (默认)
有效路径:整站有效;session.cookie_path=/
有效域:仅在当前域下有效;session.cookie_domain=
是否安全连接传输:否;session.cookie_secure=
是否仅为http使用:session.cookie_httponly=
以上session数据特征,都是有cookie中所存储的session_idcookie变量特征所导致的
当关闭浏览器,再次打开浏览器请求session值时,请求不到,原因是存储于浏览器端
的session_id 值消失,但在服务器生成的文件并没有消失,所以,要想改变session的
存储周期,就必须改变session_id 的生命周期;
A方案.通过修改配置文件php.ini实现;[不建议使用]
B方案.通过在脚本中,使用函数ini_set来进行配置的修改,仅在设置后的脚本周期
内有效,要保证在开启session前设置完毕;[可用] ini_set('选项','值');
C方案.使用特定功能函数:[推荐],要保证在开启session前设置完毕;
session_set_cookie_params('有效期','有效路径','有效域','是否安全传输',
'是否httponly');完成设置;
session语法:
①session数据 可以是任意数据类型,因为session数据取的 数据是序列化后存储的;
②$_SESSION数组元素的下标只能是字符串类型;
③session_start();类似于header()前不能有输出(echo.var_dump.html[代码,标签] )都不允许;
session数据区:
在脚本周期后,持久存储当前会话session数据的区域;
在脚本周期内,使用$_SESSION这个变量管理会话session数据;
Session销毁:
使用函数 :session_destroy()完成。
销毁:删除当前session对应的数据区,关闭session机制!
关闭session机制后,导致余下的session操作都不处理!
注意:
$_SESSION变量,在销毁session后,是不会自动消失,但结束不完成写操作。因此下次脚本周期,就不能获取到存储的session数据。
如何完整删除与当前session相关的全部数据?
Session_destroy(); 数据区
Unset($_SESSION); 销毁变量
//setCookie(‘PHPSESSID’, ‘’, time()-1), 销毁cookie中的session-iD
setCookie(session_name(), ‘’, time()-1), 销毁cookie中的session-iD
tip:
PHPSESSID,称之为session.name可以被配置的php.ini,可能会被改变,所以
使用函数session_name()来获取当前的值!
(配置文件php.ini)
如何清空session数据?
不要 unset($_SESSION)
需要:$_SESSION = array();
重写session的存储机制
目的:
1, 便于管理大量的session数据
2, 便于web服务器集群共享session数据。
方案:
入库,入内存
实现过程:
定义(实现)自定义的相关的存储处理函数
将其设置为session机制需要的存储函数(告知给session机制,使用我们的函数完成存储处理)
Session机制,共需要6个存储处理函数
设置session的存储机制函数:
使用PHP函数:
Session_set_save_handler(开始处理器,结束处理器,读处理器,写处理器,删除处理,垃圾回收处理器)
常规使用session机制即可:
建立session表
表中的记录,对应session文件。
create table `session` (
session_id varchar(40) not null default '',
session_content text,
primary key(session_id)
)charset=utf8 engine=myisam;
读操作
写操作
Insert into … ON DUPLICATE KEY UPDATE
REPLACE 语法与insert一致,存在则替换,不存在则插入。
测试:
删除
垃圾回收操作
如何识别垃圾数据区?
PHPsession机制设置session数据区的最大有效期,某条session记录(数据区),在最后一次处理后,如果超过了多久之后没有被使用,则被视为垃圾数据。
该时间默认为1440s,可以被配置:
同时需要记录每个session数据区的最后处理时间。
增加字段,记录最后处理时间:
在写操作时,将其更新:
如何执行删除?
在开启session机制过程中,有概率的执行垃圾回收操作。
默认的概率为1/1000
可以配置:
可能性:
除数基础:
修改:
Ini_set();
实现该操作:
开始
Session开启时,最早执行的一个存储机制相关方法,用于初始化存储操作的相关资源。
结束
在session机制关闭时,执行的方法,最后一个执行的存储相关操作,用于收尾性工作!
补充
先执行 session_set_save_handler()在session_start()
保证session不自动开启
可以通过.htaccess配置需要的选项:
配置 session.save_handler
FilesPHP内置的session存储处理器。
建议:重写session存储机制,应该将其改为user表示用户自定义!