本帖最后由 做自己的女王ヽ 于 2018-3-2 17:19 编辑
前言: 今天就来彻底的学一些session是个啥东西,我罗列了几个需要知道的要点: 1.session 是啥? 2.怎么保存的? 3.如何运行? 4.有生命周期吗? 5.关闭浏览器会过期吗? 6.redis代替文件存储session 7.分布式session的同步问题
session是啥? 首先,我大致的知道,session是一次浏览器和服务器的交互的会话,会话是啥呢? 就是我问候你好吗?你回恩很好。就是一次会话,那么对话完成后,这次会话就结 束了,还有我也知道,我们可以将一个变量存入全部的$_SESSION['name']中,这 样php的各个页面和逻辑都能访问到,所以很轻松的用来判断是否登陆。 这是我之前理解的session,当然也是对的,只是解释的太肤浅,理解的太表面了, 面试官如果听到这样的答案其实是不太满意的。我参考了其他的很多资料,彻底理解 清楚session。 在说session是啥之前,我们先来说说为什么会出现session会话,它出现的机理是 什么?我们知道,我们用浏览器打开一个网页,用到的是HTTP协议,学过计算机的 应该都知道这个协议,它是无状态的,什么是无状态呢?就是说这一次请求和上一次 请求是没有任何关系的,互不认识的,没有关联的。但是这种无状态的的好处是快速。 所以就会带来一个问题就是,我希望几个请求的页面要有关联,比如:我在www.a.co 是2个不同的页面,也就是2个不同的HTTP请求,这2个HTTP请求是无状态的,也就 是无关联的,所以无法单纯的在index.php中读取到它在login.php中已经登陆了! 那咋搞呢?我不可能这2个页面我都去登陆一遍吧。或者用笨方法这2个页面都去查 询数据库,如果有登陆状态,就判断是登陆的了。这种查询数据库的方案虽然可行, 但是每次都要去查询数据库不是个事,会造成数据库的压力。 所以正是这种诉求,这个时候,一个新的客户端存储数据方式出现了:cookie。co okie是把少量的信息存储在用户自己的电脑上,它在一个域名下是一个全局的,只 以从这个域名的任意页面读取cookie中的信息。所以就很好的解决了我在 www.a.co同时又不用反复去查询数据库。 虽然这种方案很不错,也很快速方便,但是由于cookie 是存在用户端,而且它本身存 储的尺寸大小也有限,最关键是用户可以是可见的,并可以随意的修改,很不安 全。那如何又要安全,又可以方便的全局读取信息呢?于是,这个时候,一种新的 存储会话机制:session 诞生了。 我擦,终于把session是怎么诞生的给圆清楚了,不容易啊!!! 好,session 诞生了,从上面的描述来讲,它就是在一次会话中解决2次HTTP的请 求的关联,让它们产生联系,让2两个页面都能读取到找个这个全局的session信息。 session信息存在于服务器端,所以也就很好的解决了安全问题。 session的运行机制和是怎么保存的? 既然,它也是一种服务区存储数据的方式,肯定也是存在服务器的某个地方了。 确实,它存在服务器的/tmp 目录下,这一点我们接下来慢慢讲。 我们先说下它的运行机制,是怎么分配的。我们主要用PHP中session的机制, 其实各种语言都差不多。 如果这个时候,我们需要用到session,那我们第一步怎么办呢?第一步是开启 session: session_start(); 这是个无任何返回值的函数,既不会报错,也不会成功。它的作用是开启session, 并随机生成一个唯一的32位的session_id,类似于这样: 4c83638b3b0dbf65583181c2f89168ecsession的全部机制也是基于这个session_id,它用来区分哪几次请求是一个人发出 的。为什么要这样呢?因为HTTP是无状态无关联的,一个页面可能会被成百上千人 访问,而且每个人的用户名是不一样的,那么服务器如何区分这次是小王访问的,那 次是小名访问的呢?所以就有了找个唯一的session_id 来绑定一个用户。一个用户 在一次会话上就是一个session_id,这样成千上万的人访问,服务器也能区分到底 是谁在访问了。 我们做个试验,看看,是不是这样的: 我们在php.iyangyi.com 域名下的a.php 页面中,输入如下代码: session_start(); echo "SID: ".SID."<br>"; echo "session_id(): ".session_id()."<br> "; echo "COOKIE: ".$_COOKIE["PHPSESSID"]; 我们访问一下a.php页面,看能输出什么? 我们看到居然还有一个警告。我们先一个一个的看。首先SID这个常量,我们没有 给它赋值,它居然能有输出,其次session_id()这个系统方法是输出本次生成的sess ion_id。最后$_COOKIE['PHPSESSIID'] 没有值,这个我们接下来说。 好,我们再次刷新这个页面,我们能看到什么? 奇怪的事情发生了。SID 没有值了,$_COOKIE['PHPSESSID']中有值了。而且,2 次刷新,session_id 都是一样 的:bjvlo4p38cfqkr1hr7pe924ts3,实际情况下,只要不关闭网页,怎么刷新都是一样: 既然我们看到COOKIE中有值了,我们,打开firebug开看到底是什么: 而且这个PHPSESSID的过期时间是会话,什么意思呢?就是浏览器只要不关就一直 不存,浏览器一关就过期,消失了。
|