1,Session技术
1.1,Cookie的不足
Cookie是将会话数据,直接存储浏览器端。带来了:
问题一:安全性
问题二:数据传输。大量的会话每次都需要从浏览器端传输到服务器端。限制了浏览器端可以存储的会话数据量。
1.2,Session原理
将会话数据存储在服务器端。需要解决如何区分不同浏览器的会话数据问题。
方案如下:服务器端为不同的会话数据分配唯一的标志,浏览器去存储该标志。
1.3,基本操作
1.3.1,开启session功能
session_start()
操作session之前,一定要先开启session!
1.3.2,操作session数据
超全局$_SESSION数组,完成session数据的全部管理,增,删,修改,获取!
设置:
获取:
就像操作一个普通的数组一样,操作session即可!
1.4,Session标志,session-ID
一:session_id存储在浏览器端的cookie中,就是一个普通的cookie变量(他具有所有的cookie变量具有的属性)
二:服务器PHPsession功能,负责生成session-ID,并以cookie的形式,分配到浏览器前端。
查看浏览器已经存储的cookie中的session-ID:
如果浏览器没有携带session-ID:
响应数据中,就一定会重新分配
如果浏览器存在,则 请求时携带到服务器端,服务器端不需要再生成了:
1.5,服务器端session数据区
默认情况下,session数据区是位于服务器所在操作系统的临时目录中,以独立文件的形式进行存储的。
存储位置基于配置:
Php.ini
1.6,Session数据的属性
Session数据的属性,是依赖于session对于的session-Id这个cookie变量的属性的。
例如有效期:
由于session-ID这个cookie变量的有效期为会话周期,也导致session数据在浏览器关闭后立即失效!
其他的cookie变量具有的属性都是影响session-id的:
例如:
由上可见:session的默认属性为:
当前域名下,有效。
整站有效。
浏览器关闭失效。
设置session数据
我们也有办法设置session-id这个cookie变量的属性
setcookie(PHPSESSID);
方案一:推荐!
session_set_cookie_params(有效期,有效路径,有效主机,安全,httponly);
设置属,一定在 开启session机制之前!
强调,实操中,有效期,有效路径,等属性都是不需要修改的。
方案二:修改PHP的配置项
Session.cookie_lifetime有效期
Session.cookie_path有效路径
Session.cookie_domain有效域名
Session.cookie_secure,仅仅安全连接下传输(安全)
Session.cookie_httponly
选择修改配置文件,使得当前php服务器上所有的项目都统一session属性的默认值(不推荐)
配置项修改函数 ini_set(),在脚本周期内,修改某个配置项的值!(推荐)
1.7,$_SESSION 域 和session数据区(文件)关系
_SESSION变量的产生:在session_start时
如图所示:
1.8,销毁session,session_destory()
函数session_destory(),销毁session。
① 关闭session机制。(后期关于session的处理不再执行)《=》session_start
② 删除当前session对于的数据区文件。
导致,下个脚本周期。访问不到任何的session数据!
通常,退出,注销。当不需要整个会话的session数据时,可以选择销毁session!
该销毁session的函数,仅仅完成删除对于的session数据区(文件),但并不能同时删除$_SESSION数组,以及浏览器端的session-ID;
完全销毁session
通常逻辑上的销毁session,应该将于当前session相关的全部内容都删除,才合理:
应该同时删除,session-id,$_SESSION变量,session数据区都删除才可以:
其中:PHPSESSID,这个名字是可能被配置修改的!
Php 的配置:
通用的做法使用函数:session_name()来获取当前配置的session.name的值!
以上的语法细节:
Unset($_SESSION);删除session变量,不能独立使用。
如果想 清空所有的session数据时,不能使用,而应该:$_SESSION = array();
1.9,垃圾回收
存储于服务器端的session数据区,当满足垃圾条件时,被删除,回收可用的存储空间!
一:如何判定垃圾?
如果某个数据区(文件)超过有效期未被使用,则被视为垃圾数据区。
默认的有效期为:1440s,可以被配置的:
最后修改时间,有效期,当前时间 判断出来是否为垃圾:
垃圾:当前时间-最后修改时间 > 有效期。(最后修改时间 < 当前时间-有效期)
二:如何删除这些垃圾?
在开启session时(session_start())就会有一定的概率 触发 垃圾回收操作!
默认的概率是1/1000,可以被配置:
可能性:
基数(除数):
测试时,调整概率和有效期时间,来测试!
执行几次后,就会删除掉过期的数据区!
1.10,Session存储机制的重写
由其他方式存储session数据。默认是文件的方式。实操时:还有 数据库,内存管理器。
两个原因致使需要修改session的存储机制:
1:大量的session需要管理。
2:多web服务器共享session。
1.10.1,一:提供可存储操作的函数(方法)
共有6个,四个与存储直接相关,两个辅助。
以上函数,仅仅需要负责定义,而不需要负责调用。
PHP核心程序,在需要的时候完成调用!
1.10.1.1,创建session数据表
每个表中的记录,相当于原来的一个session文件。
结构如下:提醒 字段注释 -- 前后有空格 或者 用/* */
增加索引:Alter table session add index (last_write)
1.10.1.2,读操作
注意:
该方法,会在被调用时自动获得当前的sessionid
该方法,需要返回字符串,即使没有获取成功,也需要空字符串!
该方法,仅仅需要返回字符串数据即可,不需要对其反序列化,系统会处理。
1.10.1.3,写操作
Replace into语法上与
insert into一致
如果主键(唯一键)冲突,则会选择执行替换更新操作,如果未冲突,就是insert。
If (select) {
Update
} else {
Insert
}
Unix_timestamp();
测试:
写成功了:
读呢?测试读操作
1.10.1.4,删除
1.10.1.5,垃圾回收Gc
如果字段参与运算,最好独立在不等式的一侧,可以更好的利用该字段上的索引(如果有)
Alter table session add index (last_write)
1.10.1.8,重新设置配置项session.save_handler
session.save_handler:表示存储处理机制
默认的:
表示以文件的形式存储。
修该改为user,表示:表示自定义!
1.10.1.9,先设置session_set_save_handler(), 再开启session
切记:关闭session的自动开启。
配置项:session.auto_start表示自动开启!
1.10.2,二:将其告知给PHP程序
函数:
session_set_save_handler(开始,结束,读,写,删除,垃圾回收);
每个参数,就是回调函数(函数标志类型的参数)!
1.10.3,三:常规使用session即可:
开启session,操作$_SESSION;
2,会话技术综述
2.1,Session pk cookie?
联系:
都是会话技术的实现。
Session基于cookie,session的session-id存储于cookie中。
差异:
|
Cookie |
Session |
会话数据的存储位置 |
浏览器端 |
服务器端 |
安全性 |
低 |
高 |
传输会话数据量 |
多 |
少 |
对数据类型的支持 |
仅字符串 |
序列化存储,全部数据类型(资源不行) |
2.2,cookie禁用,session如何处理?
正常情况:cookie禁用,session也不能用!
理论情况:
只要能过每次请求向服务器传输session-id,那么没有cookie也可以…
通过,url(get)或者表单元素(post),向服务器传递session-id即可。
Php,支持配置通过非cookie方式传递session-id的(公共环境不建议设置)
两个配置项:
是否仅仅使用cookie传递session-id:
是否自动通过非cookie的方式传递session-id:
测试:
设置浏览器不支持cookie:
页面入下:
结果:
Html代码被更新为添加session-id:
2.3,如何持久化session?
理论上:
一:持久化cookie中的session-id。
二:延长对session垃圾的判定时间。
Session_set_cookie_params(24*3600);
Ini_set(‘session.gc_maxlifetime’, 24*3600);
没这么做的。Session不需要持久化。
服务器的session处理压力增大!
建议:需要持久化存储会话数据,选择cookie!
会话:session。