Session for PHP

来源:互联网 发布:淘宝代理赚钱吗 编辑:程序博客网 时间:2024/04/28 23:23

看其session之前,希望你有时间可以先去了解一下Cookie机制,因为Session其一部分是基于Cookie机制的。以下是我关于Cookie的博客:


http://blog.csdn.net/zch501157081/article/details/52028467



不同于COOKIE技术,将会话数据存储在服务器端。(这是Cookie和Session最本质的区别,下面会有说道)
那么Session是如何区分会话数据属于哪台浏览器?

一:将不同会话的session数据分别存储。存在在session数据区。

二:为每个数据区,设置一个的唯一的标识。

三:将该唯一标识,分配到浏览器端,浏览器请求时携带。



可见,session技术,基于 COOKIE技术。Session的标识(session-ID)是存储于浏览器的COOKIE中。
那么对比与COOKIE:
Session会话数据本身,安全性较高,(因为他将更多的数据存储在服务器端)
请求时携带的数据量,减少。但是不得不说会对服务器造成或多或少的压力。




Session基本操作

开启Session



只有开启了session,PHP的核心session功能,才能,生成唯一标识,分配标识到浏览器,存储数据到数据区。

即:
这里写图片描述



管理session数据

超全局数组:$_SESSION,完成所有的功能。
增删改查


这里写图片描述


注意:清空session操作,删除所有的session数据:
这里写图片描述

注:这里不能用unset ( $_SESSION)来删除session数据,原因在于他只是删除了$_SESSION 这个变量,而并没有修改session数据区里面的值,所以并不能修改。关于操作session文件的周期下面会说到。


服务器端session会话数据区



默认 :
存储在服务器端操作系统临时目录中的一个个独立的session数据区文件。
这里写图片描述
存储方式(文件),及其存储位置(系统临时目录)都是可以被配置的,配置项:php.ini:
方式:
这里写图片描述
位置:
这里写图片描述
默认注释起来;wamp在 /wamp/tmp环境下。


建议修改时使用ini_set()进行修改,而不是去修改Php.ini。其目的修改的结果仅仅对于当前脚本周期有效,不会影响其他项目!


修改配置:

这里写图片描述



浏览器端COOKIE中存储的Session-ID



其一:浏览器端不存在session-ID

浏览器向服务器请求时,不会携带session-ID。
服务器端由于要使用session机制,就会生成session-ID,在响应时分配给浏览器端。
这里写图片描述



其二:浏览器端已经存在session-ID

浏览器向服务器发出请求时,携带session-ID到服务器端:
服务器端需要开启session机制,但由于浏览器已经携带了session-ID,就不需要重新生成,直接使用浏览器携带的即可。
这里写图片描述



SESSION周期内的运行流程



如图所示:
这里写图片描述



很关键,表示了SESSION周期内的运行流程,有些内容下面会说到。

要点:
一:$sessionid的确定

二:$_SESSION这个变量,是在session_start()过程中,初始化的(定义并设置值)

三:仅仅在脚本周期内,操作$_SESSION,而不是去操作session数据区。

四:只有在脚本周期结束时,才会将当前脚本周期内处理好的session数据,存储到session数据
区中去。

五:每次请求都是相同的逻辑。





Session数据的属性



有效期,有效路径,有效域名,是否仅安全连接传输,是否为HTTPOnly


首先:session数据不像COOKIE数据,每个值都可以设置属性。
Session数据的属性是针对于所有的session数据。

其次:导致session数据属性的原因,是存储在浏览器端COOKIE中的session-ID的属性导致的。
就是指的是,该COOKIE变量的属性:PHPSESSID=XXXXXXXXXX,影响到与之关联的session数据的属性。


这里写图片描述


以上默认值,都是由PHP的配置项:php.ini决定:(以下都可以在php.ini中找到,给出的都是默认值)

Session-ID这个COOKIE变量的名(key):session.name=PHPSESSID

有效期:会话结束(浏览器关闭):session.cookie_lifetime=0;

有效路径:session的有效路径,整站有效。session.cookie_path = /;

有效域名:当前域名 session.cookie_domain = ;

是否仅仅安全连接传输: 否。session.cookie_secure = ;

是否为HTTPOnly :否 session.cookie_httponly = ;


那么如何修改该COOKIE变量的属性



1. 修改php.ini(不建议)
2. ini_set() 在开启session之前。每次开启session之前。
3. session_set_cookie_params();(推荐)
Session机制专门为设置COOKIE的属性而,创建的函数。
语法会简单写。
Session_set_cookie_params(有效期,有效路径,有效域,是否secure,是否httponly);

常见的修改:有效域名和httponly

这里写图片描述





数据类型的支持

Session支持多种数据类型,都支持。除了资源!

这里写图片描述

可见,所有的类型都可以被存储。


但是在获取session中存储的对象时,一定要存在该类的定义才可以:
否则会出现类会变成这样
这里写图片描述





销毁Session



调用了函数:
Session_destroy()
执行了销毁session!

销毁session包含两个工作:

其一:删除session对应的数据区(文件)
其二:关闭session。

Session_destroy()仅仅会删除对应的数据区文件,而不会删除$_SESSION这个变量。
测试如下:
这里写图片描述


再刷新一次:
就没有数据了


这里写图片描述



为什么会这样呢,具体请参考SESSION周期内的运行流程图,在执行session_start()时,服务器就将文件中的session内容拿出,并赋给$_SESSION,而session_destroy()并不会删除\$_SESSION这个变量,所以输出还是会有值。(下个周期就不会有值传入\$_session值中)。



那么如何完全删除和当前session相关的内容?

必须要删除 Session文件,$_SESSION变量,COOKIE中的session-ID

如下这里写图片描述





Session的垃圾回收,GC



PHP的session功能,会自动的删除那些过期的服务器端session数据区文件。


如何判别垃圾?



判断数据区文件,是否超过了多久,没有被使用。默认是1440s。
该值可以被配置:
这里写图片描述

配合上,上次修改时间,计算是否过期。(上次激活时间,只要是活跃(浏览器携带sessionid访问服务器)一次都算)



如何删除?



当开启session机制时。执行session_start()时,有概率的去 执行删除过期session数据区文件的操作。默认的概率:1/1000。由下面的配置决定:
可能性:
这里写图片描述

基数(除数):

这里写图片描述


即:默认1/1000的概率 。有人会说概率很小的,但是不得不考虑你的一次点击都会触发一次session_start。

当然你也可以根据你的需求进行修改。





如何持久化session

持久化浏览器端session-ID:
Session_set_cookie_params(3600)
持久化服务器端session数据区:
Ini_set(‘session.gc_maxlifetime’, ‘3600’);





COOKIE禁用,session是否可用


不能用!
但是理论上是可能的
想办法使用非cookie,向服务器端,每次请求传session-Id即可!
GET,url
POST,表单元素。
PHP支持该配置,支持从URL或者表单post数据中获取session-ID。并且支持自动在URL后和表单内,增加session-ID数据,自动传输:
这个是要在php.ini中配置的,这里就不详细说了。(真的不经常用)。



至于Session的一些安全性措施 可以查看
http://netsecurity.51cto.com/art/201402/428721.htm

2 0
原创粉丝点击