您的位置:首页 > 编程语言 > PHP开发

PHP session的原理剖析

2018-03-05 17:20 176 查看
1.定义2.PHP.ini配置3.文件存放4.存储方面5.垃圾回收6.应用场景7.session与cookie区别8.Session-破坏会话方面
session定义会话要使用cookie(过期时间设置为 0的 cookie),并且将一个称为会话ID的唯一标识符(一串字母数字字符)与用户或客户机关联起来启动会话函数:session_start();
通过调用 session_id()函数来访问会话ID,session_name()函数显示会话的名称,也就是php 返回给客户机的保存会话ID的cookie名称。
session_id 唯一标示符,session初始化函数调用会分配一个随机的字符串。session文件的名称是以sess_为前缀的,以session_id为结尾命名Session-php.ini配置方面1.session.save_handler=file
2.session.save_path="/tmp" (httpd等web守护进程的宿主)写权限。1、session.use_cookies:默认的值是“1”,代表SessionID使用Cookie来传递,反之就是使用Query_String来传递;
3.session.name:这个就是SessionID储存的变量名称,可能是Cookie,也可能是Query_String来传递,默认值是“PHPSESSID”;
4.session.cookie_lifetime:这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是这个所以Session不能永久使用!
5.session.gc_maxlifetime:这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除!
Session文件存放方面如果说并发访问很大或者session建立太多,在这两个目录下就会存在大量类似sess_xxxxxx的session文件,同一个目录下文件数过多会导致性能下降session.save_path = “2; /tmp/phpsession”
上面的设置表示我们把/tmp/phpsession目录作为php的session文件存放根目录,在该目录下进行两级目录散列,每一级目录分别是0-9 和a-z共36个字母数字为目录名,这样存放session的目录可以达到36*36个,相信作为单台服务器来说,这是完全够用了,如果说您的系统架构设计为多台服务器共享session数据,可以把目录级增加到3级或者更多。php自己并不会自动创建子目录,需要您自己动手去创建,网上找到这样的自动创建目录的代码
Session-存储机制方面默认情况下,php会将会话数据写入一个文件并将它放在session.save_path配置选项指定的位置,在创建一个新会话并且分配一个会话ID时。php在这个目录中写入一个文件,文件名以sess_开头,以会话ID结束 。
Session-破坏会话方面破坏会话分三步1)破坏一个会话分三步,每个步骤分不同的 代码,首先,破坏回话数据,这些数据在默认的情况下存储在服务器硬盘的文件中,这个要使用 session_destroy函数2)破坏实际会话,这个要消除会话cookie,通过会话名称调用setcookie函数,并制定一个过去的时间。如果没有指定这一步,用户以后对这个站点的请求仍然会附带发送他的会话cookie。3)最后一步是破坏$_SESSION超全局数组,从而删除与回话相关联的任何数据。办法是给$_SESSION赋一个新值
Session-回收机制方面Garbage Collector 简称GC)由于PHP的工作机制,它并没有一个daemon线程来定期的扫描Session 信息并判断其是否失效,当一个有效的请求发生时,PHP 会根据全局变量 session.gc_probability 和session.gc_divisor的值,来决定是否启用一个GC, 在默认情况下, session.gc_probability=1, session.gc_divisor =100 也就是说有1%的可能性启动GC(也就是说100个请求中只有一个gc会伴随100个中的某个请求而启动).
GC 的工作就是扫描所有的Session信息,用当前时间减去session最后修改的时间,同session.gc_maxlifetime参数进行比较,如果生存时间超过gc_maxlifetime(默认24分钟) ,就将该session文件删除。
Session服务器共享存放在memecache在[session]标签下,把session.save_handler = memcachesession.save_path = "tcp://211.162.58.77:11211"
Session-应用场景使用session防止表单重复提交:使用session方式的登录验证实例代码:使用session随机码验证投票合法性:
cookie与session关系(一)•存储位置:
1.session存储在服务器位置上,可以通过php.ini里面配置session相关配置2.cookie存储在客户端上的上(其实可以分两种: 1,持久性cookie,设置了cookie的时间,以文件方式存在硬盘上, 2,会话cookie,没有设置cookie时间,cookie的生命周期也就是关闭浏览器前就消失,一般不会保 存在硬盘,而是保存在内存上)cookie与session关系(二)PHPSESSID就是关联服务器session的重要参数session文件:sess_cpt2ah3pi4cu7lo69nfbfllbo7session_id的生成格式就是:sess_加上一串PHPSESSID的值
我们可以这样理解:当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识 (称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相 关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应 中返回给客户端保存。保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给 服务器。一般这个cookie的名字都是类似于SEEESIONID
cookie&session-相关网址php.net/manual/zh/ref.session.phphttp://www.cnblogs.com/phphuaibei/archive/2011/11/15/2250082.htmlhttp://www.cnblogs.com/dkblog/archive/2010/06/04/1980694.htmlhttp://blog.fity.cn/post/427/http://www.blogjava.net/qileilove/archive/2013/04/01/397217.htmlhttp://blog.163.com/lgh_2002/blog/static/4401752620105246517509/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: