1)Session详解
1、seesion的基本原理
存储于浏览器端Cookie中的session-id,就是一个普通的cookie变量(在session机制中尤其特殊的含义)
每个会话,所生成存储于服务器端的session数据区,默认的,以文件的形式,存储于服务器端操作系统的临时目录中
使用session的优势:
(1).会话数据原文存储于浏览器端,原始数据安全性较低。如果cookie数据量较大,由于每次请求都要携带,增加带宽使用。
(2).使用session技术来实现:将会话数据,存储于服务器端!同时使会话数据可以区分浏览器!
(3).在服务器端为每个会话数据建立独立的会话数据区(来存储当前会话的全部数据),每个会话数据区存在唯一的标志,同时浏览器端存储该唯一标志,做配对使用!
2、基本操作
(1)、开启session机制
第一种方式:session_start();
第二种方式:通过php.ini设置为自动开启:Session.auto_start
(2)、利用$_SESSION操作session数据
增,删,改,查,都是使用$_SESSION完成。
每个元素,就是session数据。
就像操作普通数组一样,操作$_SESSION数组,就可以完成对session数据的操作!
示例说明:
结论:在示例文件中销毁seesion数据,测试文件得不到内容;
若在浏览器关闭后,先访问测试文件,也将得不到输出内容,说明session的有效期就是当前会话结束。
注:seesion数据的设置可以完成登陆状态的储存
3、Session数据属性
如果需要更改session数据的属性,则需要更改存储session-ID的cookie变量PHPSESSID的属性;
php.ini中存在该属性的配置
(1).有效期:会话结束
php.ini中:session.cookie_lifetime = 0
(2).有效路径:整站有效
php.ini中:session.cookie_path = /
(3).有效域:当前域
php.ini中:session.cookie_domain =
(4).是否仅安全连接传输:否
php.ini中:;session.cookie_secure =
(5).是否仅为HTTPONLY使用
php.ini中:session.cookie_httponly =
以上session数据的特征,都是由浏览器cookie中所存储的session-idcookie变量的特征所导致的。
注意:如果需要对默认属性加以修改,有以下三种方法:
第一种方式:更改php.ini配置文件即可(不建议)
第二种方式:通过在脚本中,使用函数ini_set()来进行配置的修改,仅在设置后的脚本周期内有效,要保证在开启session前设置完毕(可以选择)
Ini_set(‘选项’, ‘值’)
第三种方式:(推荐)使用特定功能函数:
session_set_cookie_params(有效期, 有效路径,有效域,是否仅安全传输,是否HTTPONLY)设置完成,先使用特定功能函数,再开启session_start()。
注意:
选项的设置是针对cookie中的sessionID,因此是针对所有session数据的.
Session属性通常都会保持其默认值,不建议修改。
4、Session使用语法问题
Session数据可以是任意的数据类型,cookie的数据是字符串类型。
由于session的数据可以是任意的数据类型,因此,session内的数据是序列化后才存储的。
(1)、$_SESSION数组元素的下标,仅仅可以是字符串类型
$_SESSION['34']='php34'; //数组的下标不能为数字,会报错
示例:$_SESSION['student_list'] = array(
array('name'=>'han', 'gender'=>'male', 'hobby'=>array('足球','篮球','排球')),
array('name'=>'杨过', 'gender'=>'male', 'hobby'=>array('小龙女','雕','打仗'))
);
(2)、Session_start(),类似于header函数,前不应该有输出,空格,php代码前的html也不能有
5、Session数据区
在脚本周期外,持久存储当前会话session数据的区域。
在脚本周期内,使用$_SESSION这个变量管理的会话session数据
6、Session销毁
(1)、使用函数session_destory();来对session进行销毁
销毁:删除当前session对应的数据区,关闭session机制。
关闭session机制后,导致余下的session操作都不处理。
注意:
$_SESSION 变量,在销毁session后,是不会自动消失,但结束不完成写操作。因此下次脚本周期,就不能获取到存储的session数据。
(2)、如何完整删除与当前session相关的全部数据?
Session_destroy(); 数据区
Unset($_SESSION); 销毁变量
//setCookie(‘PHPSESSID’, ‘’, time()-1), 销毁cookie中的session-iD
setCookie(session_name(), ‘’, time()-1), 销毁cookie中的session-iD
注意:PHPSESSID,称之为session.name 可以被配置的php.ini
使用函数session_name()来获取当前的值!
(3)、如何清空session数据?
不要使用 unset($_SESSION)
需要使用:$_SESSION = array();
7、重写session的存储机制
目的:
1,便于管理大量的session数据
2,便于web服务器集群共享session数据。
方案:
入库,入内存
实现过程:
定义(实现)自定义的相关的存储处理函数
将其设置为session机制需要的存储函数(告知给session机制,使用我们的函数完成存储处理)
Session机制,共需要6个存储处理函数
设置session的存储机制函数:
使用PHP函数:
8、建立session表
表中的记录,对应session文件。
9、读操作
session机制开启的过程中调用,作用是从当前的session数据区读取内容。
为了从session表里获取当前的会话数据,则需要传递一个$sess_id,来获取当前的session数据,
结果返回的不是整条数据,而是一个字符串
示例:
10、写操作
脚本周期结束,才会有写操作
任务:将当前脚本处理好的session数据,持久化存储到数据库中。
需要两个参数:$sess_id [需要知道写到数据库哪条记录里面]
$sess_content 是个字符串类型,序列化好的session内容字符串
11、删除操作
执行时机:调用了session_destroy()销毁session过程中被调用
工作:删除当前session的数据区(记录)
12、垃圾回收操作gc
如何识别垃圾数据区?
PHPsession机制设置session数据区的最大有效期,某条session记录(数据区),在最后一次处理后,如果超过了多久之后没有被使用,则被视为垃圾数据。
(1).该时间默认为1440s,可以被配置:
在php.ini中修改 session.gc_maxlifetime = 1440
(2).同时需要记录每个session数据区的最后处理时间;
增加字段,记录最后处理时间,
在写操作时,将其更新$sql="REPLACE INTO `session` VALUES('$sess_id','$sess_content',unix_timestamp())";
如何执行删除?
在开启session机制过程中,有概率的执行垃圾回收操作。
(1)默认的概率为1/1000,修改垃圾回收的概率
第一种方式:
可以在php.ini中配置:session.gc_probability = 1
除数基础:session.gc_divisor = 1000
第二种方式:
在session_start();之前写入修改代码
示例:
13、开始Begin
Session开启时,最早执行的一个存储机制相关方法,用于初始化存储操作的相关资源
14、结束End
在session机制关闭时,执行的方法,最后一个执行的存储相关操作,用于收尾性工作!
注意:
(1)、为了保证session不自动开启
可以通过.htaccess配置需要的选项:php_flag session.auto_start 0
(2)、在session_start()执行之前,先执行 session_set_save_handler()
Session_set_save_handler函数(开始处理器,结束处理器,读处理器,写处理器,删除处理,垃圾回收处理器)
(3)、为了重写session存储机制,应该将其改为user表示用户自定义;
配置 session.save_handler,files是PHP内置的session存储处理器,
修改php.ini中session.save_handler = files为session.save_handler = user
15、会话总结:
session和cookie都是实现会话的方法;
Session基于cookie。
Cookie禁用,session是否可用?
常规:Cookie禁用,session不能用;
技术上,可以使用:
Cookie用来存储session的 ID,每次请求时携带。
通过 get,post,方式向服务器传递session-ID。
16、PHP提供如下的设置,帮助在cookie禁用的情况下,通过get或post方法传输sessionid
是否仅仅使用cookie来传输session-ID:ini_set('session.use_only_cookies', '0');
是否自动采用其他方式传session-id:ini_set('session.use_trans_sid', '1');
示例session表结构:
示例代码:
session.php
userSession.php
2)Cookie详解
1、Header(‘Location: URL’);
PHP(服务器)向浏览器发送一条指令Location,告知浏览器,应该重定向的URL上。
Header(‘Content-Type: ‘);
Header();就是PHP向浏览器发送指令(响应头信息),指令有多种。
举例说明:jump1.php
<?php
header('Location: test2.php');
die;
?>
test2.php
<?php
header('Content-Type: text/html; charset=utf-8');
echo "这是从jump1.php跳转来的文件header('Location: test2.php');";
?>
注意:
(1)、Header()函数前不能存在任何的输出内容
(2)、若想使得Header()函数前可以存在输出的内容,需修改php.ini中的output_buffering
(3)、若不终止Header()函数的执行,Header()函数后边的代码也会照常执行,因此,跳转后要立即终止当前脚本的执行(die;),才符合常规的跳转逻辑!
2、Refresh跳转指示,可以设置在从一个页面跳转到另一个页面时,在该页面停留一段时间,再跳转到另一个页面
语法:Header(‘Refresh: TIME; URL=目标URL’);
Refresh这个响应指令,是在N秒后,刷新到指定的目标URL上。
示例代码:
jump1.php
<?php
header('Content-Type: text/html; charset=utf-8');
header('Refresh: 5; URL=test2.php');
echo "在本页面上停留5秒后跳转";
die;
?>
test2.php
<?php
header('Content-Type: text/html; charset=utf-8');
echo "这是从jump1.php跳转来的文件header('Refresh: 5; URL=test2.php');";
?>
3、cookie技术
注:cookie在浏览器和服务器之间传输的原理
设置cookie:在响应数据区,会出现set-cookie指令,用来服务器告知浏览器需要设置的cookie信息,浏览器请求时:如果存在则在请求数据中携带
基本原理:允许服务器端脚本在浏览器端存储数据的一种技术。(可以见cookie是浏览器的技术)。
其特点是:允许服务器向浏览器发送指令,用来管理存储在浏览器端的cookie数据。
浏览器如果存储了某台服务器所设置的cookie数据,浏览器再向服务器请求时,会携带存储的cookie数据到服务器端。
(1).cookie的增删改
函数:Setcookie(KEY, VALUE)
完成cookie数据的设置,Key存在则更新,不存在则添加,如果值为空字符串,表示删除该KEY
增加一个cookie参数: setCookie('class_name','php34');
修改一个cookie的参数,只需改cookie的值即可覆盖: setCookie('class_name','fugai');
删除cookie的参数:setCookie('class_name',' '); 或 setCookie('class_name');
(2).获取浏览器在请求时携带的COOKIE数据
使用超全局数组变量,$_COOKIE 完成对cookie数据获取。
PHP核心,在初始化阶段,会将所有请求的cookie数据,整理到$_COOKIE变量中,供PHP脚本所使用!
其中 每个$_COOKIE中的元素,对应一个cookie变量,元素的键就是cookie的KEY,元素的值,就是cookie的Value。
示例:var_dump($_COOKIE['class_name']);
(3).cookie的有效期(cookie的第三个参数)
语法:特殊的有效期值
0,默认的,表示会话周期
Time()-1,删除cookie的标准做法。setCookie(‘KEY’,‘’, time()-1)
PHP_INT_MAX: 逻辑上表示永久有效的cookie。
默认:称之为临时cookie,也叫会话cookie,会话周期结束(浏览器关闭)。
设置cookie的有效期:setCookie('class_name','php34',time()+60); //该会话的时间周期为60s
问题:是谁判定cookie失效了呢?
浏览器,服务器在设置cookie时,会同时告知浏览器该cookie的有效期。
浏览器在向服务器发送请求时,会检测cookie的是否有效,只有没有过有效期的cookie数据请求时,才会携带。
(4).setCookie()的第四个参数设置有效路径->通常设置为/表示,站点根目录有效,也就是整站有效
有效路径的判断也是在浏览器端,服务器会将有效路径设置时,告知浏览器。
默认:Cookie在当前路径及其后代路径有效。
路径:不是代码所在文件的本地磁盘路径,而是URL请求的路径关系,不同路径,下同名的cookie可以同时存储于浏览器端。
浏览器发出请求时,会先查找当前目录内有效的cookie,再向上查找,将所有有效的,都携带到服务器端,服务器在形成$_COOKIE时,会出现重写效果,先出现的保留!
语法:setCookie('class_name','php34',time()+60,'');
‘’ 默认值,代表当前路径
(5).setCookie()的第五个参数设置有效域
默认:‘’
Cookie仅仅在当前域下有效。
可以通过设置,使cookie的有效域,扩展到某个一级域名下的所有子域;
Test.kang.com
Shop.kang.com
.kang.com 一级域名
Test.kang.com二级域名
示例:setCookie('class_name','php34',time()+60,'','kang.com');
(6).setCookie()的第六个参数设置是否仅安全传输
ttps://
加密的http协议!
默认:‘’
Cookie,不论浏览器发出的是http还是https都会将有效的cookie携带的服务器端。
如果将 第 6 个参数设置为true,表示 激活仅安全连接传输,此时浏览器在向服务器发出请求时,如果请求协议为http,就不会向服务器发送这些设置为仅安全连接传输的cookie数据。
示例:setCookie('not_secure', 'php34', 0, ' ', ' ','false'); //不开启仅安全连接传输
setCookie('do_secure', 'php34', 0, ' ', ' ','true'); //开启仅安全连接传输
此时发出http非安全连接:仅仅not_secure 被传输了
(7).setCookie()的第七个参数设置HTTPONLY特性
默认:浏览器存储的cookie是可以被其他脚本所处理的
通过第7个参数,设置为HTTPONLY特性,表示仅仅在http请求中使用!
示例:setCookie('do_httponly', 'php34', 0, ' ', ' ','false','true'); //开启HTTPONLY
setCookie('not_httponly', 'php34', 0, ' ', ' ','true','false'); //不开启HTTPONLY
建议,该属性设置为true
使用时,被整理成数组
注意:$_COOKIE仅仅存储是浏览器请求时携带的cookie。
当前脚本周期内,设置的cookie,不能在$_COOKIE中存在的。
类似于header(),setCookie()前也不能存在任何的输出
说明:Cookie值,仅仅支持字符串类型。
Cookie键,可以写成下标数组形式。