Welcome to

Mr.Xiong

Home / PHP / Session原理简述

Session原理简述

Session存在的意义,估计每个做Web开发的人都是了解的,就为了解决HTTP是无状态协议所带来的问题,不多说了。这里主要想说的是服务端与客户端是如何利用Session进行交互的。

工作流程

先看下面这幅流程图:

当用户第一次访问站点时,PHP会用session_start()函数为用户创建一个session ID,这就是针对这个用户的唯一标识,每一个访问的用户都会得到一个自己独有的session ID,这个session ID会存放在响应头里的Cookie中,之后发送给客户端。这样客户端就会拥有一个该站点给他的session ID。

当用户第二次访问该站点时,浏览器会带着本地存放的Cookie(里面存有上次得到的session ID)随着请求一起发送到服务器,服务端接到请求后会检测是否有session ID,如果有就会找到响应的Session文件,把其中的信息读取出来;如果没有就跟第一次一样再创建个新的。

通常站点的退出功能,实际上就是调用一下session_destroy()函数(也有可能更复杂些),把该用户的Session文件删除,再把用户的Cookie清除。这样客户端和服务端就算没有联系了。

图中的红框部分就是一次完整的HTTP请求,因为HTTP是无状态的,所以一次请求完成后客户端和服务端就不再有任何关系了,谁也不认识谁。但由于一些需要(如保持登录状态等),必须让服务端和客户端保持联系,Session ID就成了这种联系的媒介了。

客户端的工作

通过上面的分析我们可以知道Session实际上是依赖与Cookie的,当用户访问某一站点时,浏览器会根据用户访问的站点自动搜索可用的Cookie,如果有可用的就随着请求一起发送到了服务端。每次接收到服务端的响应时又会更新本地的Cookie信息。

当然也可以用GET方式来传递session ID,但不推荐用GET,这样不安全。

服务端的工作

由上面的流程图可以看到,服务端实际上是把产生的一些数据存放在了Session文件中,该文件的名字就是”sess”加上session ID,这些文件的存放位置就是phpinfo()查到的session.savepath值。

由上图我们可以很清楚的看到,服务端和客户端保存着同样的session ID信息,这就是两者保持联系的钥匙。

反面影响

有好处必然也有坏处,Session带来的最主要问题就是对性能的影响,可以想象一下,对于一个千万用户级的Web站点,如果每个用户都保存Session文件,那每次用户访问光寻找相应的Session文件就要耗掉不少系统资源的。所以这时就要对Session的存储做一些自定义的设定了,如分目录或哈希等等。除了保存到Session文件,也可以抛弃PHP自带的Session功能,自己实现Session,将Session信息存放到数据库当中,这样做最好对数据库进行一下缓存的设置了,不然对上千万的数据进行太频繁的检索,也是蛮耗资源的。

定时清除

客户端和服务端的这种联系必然是需要有时间的规定的,所以需要定期清除Session。这个问题就需要在两方面考虑了,一个是清除服务端Session文件,一个是清除客户端的Cookie信息,因为两者都各保存着一半的信息。

PHP GC进程可以扫描Session存放目录清除Session文件,但这个进程是特别耗资源的,所以PHP默认是1%的几率在一个Session启动时去清理一次过期的Session,所以并不是说一个用户Session过期了,他对应的Session文件就马上被清除,99%的几率是没被清除的。这就需要我们程序员自己动手了。可以在session信息中存放一个过期时间,值为用户最后一次访问的时间。当用户一访问,就用当前时间减去上次访问时间看是否超时,如果超时了就删除相应Session文件,并设置Cookie的Expires属性为负值,使其客户端的Cookie信息也过期,这样浏览器就自动把它删掉了。

PHP关于Session的常用函数

  • session_start(): 启动Session,这个没什么说的了。根据session ID打开Session文件,如果没有session ID就创建一个ID和对应的Session文件
  • $_SESSION():存放用户信息的全局数组,Session文件中除了存放$_SESSION中的数据实际也会存放其他的信息,如id等
  • sessionunset(): 清空$_SESSION数组,它是把数组里的值清空了,而$_SESSION这个变量还是存在的,和unset($_SESSION)是完全不同的概念
  • sessioncommit():提交Session数据并结束Session,把$SESSION数据写到文件里并结束Session。实际上当一个页面执行结束后,PHP会自动执行与这个函数相同的操作。所以这个函数也很少能用上
  • session_destroy():注销Session,这个就是关闭Session,并删除掉相应的Session文件了。切断了客户端和服务端的联系。

 

Finally,谢谢大家的阅读!祝每天开心~
版权声明:本文为博主半原创文章,未经博主允许不得转载。

赞赏

微信赞赏支付宝赞赏

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

雄心勃勃但谦卑温逊!

>> <<