参考资料:https://blog.csdn.net/liluo_2951121599/article/details/79011840
session场景话:
相当于我们去商场之前存箱子,保安让我们把包存到柜子里,并给我们一个手牌,当我们要走的时候,可以拿着牌进行比对,给我们东西;
session理解为存放我们数据的 "箱子",当然,这些 "箱子"都在服务器端存着,服务器给访问者一把唯一的"手牌",这个手牌被称作session_id,访问者凭借自己的session_id,就能获取到自己存在服务器端的数据;
1、客户端第一次访问的时候,没有cookie怎么办?
HTTP请求一个页面后,如果用到开启session,回去读cookie中的PHPSESSION是否有,如果没有,则会新生成一个session_id,先存入cookie中的PHPSESSID中,在生成一个sess_前缀文件。当有写入$_SESSION的时候,就会往sess_文件里序列化吸入数据。
当读取session变量后的时候,先会读取cookie中的PHPSESSID,获取session_id,然后再去找这个sess_sessionid文件,来获取对应的数据。由于默认的PHPSESSID是临时的会话,在浏览器关闭后,会消失,所以我们重新访问的时候,会生成session_id和sess_这个文件。
2、第一次访问的时候,服务器上如何根据不同的客户端访问产生唯一的session
3、第二次访问的时候,不做判断直接运行生成session的函数还会重复生成session嘛
每次我们访问一个页面,如果有开启session,也就是有session_start() 时,就会自动生成一个session_id 来标注是这次会话的唯一ID,同时也会自动往cookie里写入一个名字为PHPSESSID的变量,它的值正是session_id,当这次会话没结束,再次访问的时候,服务器会去读取这个PHPSESSID的cookie是否有值有没过期,如果能够读取到,则继续用这个session_id,如果没有,就会新生成一个session_id,同时生成PHPSESSID这个cookie。由于默认生成的这个PHPSESSID cookie是会话,也就是说关闭浏览器就会过期掉,所以,下次重新浏览时,会重新生成一个session_id。
4、生成后的session是怎么传给客户端的,如果多个页面会生成多个PHPSESSID,那岂不是覆盖了?
服务端生成 session_id,通过 HTTP 报文发送给客户端(比如浏览器),客户端收到后按指示创建保存着 session_id 的 cookie。cookie 是以 key/value 形式保存的,看上去大概就这个样子的:
PHPSESSID=e4tqo2ajfbqqia9prm8t83b1f2
在 PHP 中,保存 session_id 的 cookie 名称默认叫作 PHPSESSID,这个名称可以通过 php.ini 中 session.name 来修改,也可以通过函数 session_name() 来修改。
5、产生session时,如何判断不同客户端生成不同的session
6、不同客户端访问的时候,服务器怎么区分是哪个客户端?
Cookie 也是由于 HTTP 无状态的特点而产生的技术。也被用于保存访问者的身份标识和一些数据。每次客户端发起 HTTP 请求时,会将 Cookie 数据加到 HTTP header 中,提交给服务端。这样服务端就可以根据 Cookie 的内容知道访问者的信息了。
7、session的默认时间周期是多少?8、cookie的默认时间周期是多少?
session_cookie_lifetime = 0 这个设置在客户端生成PHPSESSID这个cookie的过期时间,默认是0,也就是关闭浏览器就过期,下次访问,会再次生成一个session_id,所以,如果想关闭浏览器会话后,希望session信息能够保持的时间长一点,可以把这个值设置大一点,单位为秒
10、同一个浏览器,同一个页面访问A,B两网站,那么他们的cookie名称和值都是相同的,服务器怎么区分呢?
11、同一浏览器,同一个网站,cookie设置的名字一样,新生成的cookie会覆盖之前的cookie吗?
php中用来清理过期的session信息:
unset($_SESSIONS['hello']);#将sess_xxx文件中的hello变量给删除了,其他的变量该有的都保存着;
session_unset(); #销毁sess_xxx文件中的所有变量,但是这个sess_xxx文件还是保存着。
session_destroy():#直接将sess_xxx文件给删除掉