会话(cookie session)

来源:互联网 发布:groovy 数组 编辑:程序博客网 时间:2024/05/13 01:49

会话技术:即实现登陆标志的存储,要求其能区分浏览器,并在浏览器的多次请求周期内,可以持久存储的一种存储机制.

【注:该登陆标志不能用数据(变量,常量)来标记,因为数据都有一定的生命周期,一个脚本的周期(浏览器向服务器发送一次请求,服务器将该请求交由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表示用户自定义

 












0 0